Gotchas 31-对目标类型为指涉物为常量的指针类型的类型转换的认识误区
2012-09-30 17:13
309 查看
首先要理清几个术语:常量指针(const pointer)和指向产量的指针:
常量指针(const pointer)是指一个拥有常量值得指针,其中并不包含“其指涉物是否为常量”的任何暗示。
const char *pci;//指向常量的指针
char *const cpi=0;//常量指针
char const *pci2;//仍然是指向常量的指针
const char * const cpci=0;//指向常量的常量指针。
char *ip;//普通的指针
“C++标准规定允许进行‘增加常量性’的(无条件)类型转换”。举例来说,我们可以把一个指向非常量的指针复制到一个指向常量的指针。这样我们就可以——当然也可以做许多其他的事情——把一个指向char类型的非常量指针传递给标准库中的strcmp或strlen函数,尽管他们声明只接受指向char类型常量的指针,直觉上我们能够理解为什么可以这么做:允许指向常量的去指向非常量的(但本身不失其指涉物常量性),因为我们没有因此丧失任何数据声明时的约束,当然我们也能理解为什么逆向的转换被封印,因为这么一来我们就获取到了数据被声明时更多的权限;
size_t strlen(const char *);
//...
int i=strlen(cpi);//没问题参数传递
pci=ip;//也没问题指针赋值
ip=pci;//错误
请注意C++语言规范在数据常量性问题上采取一种保守的观点:其实这么说也可以——在不立即引起核心转储的前提下——我们可以修改指向常量指针所涉的数据,只要这些数据实际上(在未被指涉的语义中)并非常量①,或他们却是常量,但是运行该代码的平台并不把数据分配到内存储器的只读区域。总之常量性的典型用途是在设计期的一种立场表达,同时也是一种系统属性标示。C++语言看来会强制推行设计者的意图。
=============================================================
注释:
①译注:也就是说让一个声明为指向常量的指针指向一个本身不是常量的数据,那么就不能通过这个指向常量的指针来修改这个数据了,但是并不是说明这个数据不能修改。→参见常见错误6.
常量指针(const pointer)是指一个拥有常量值得指针,其中并不包含“其指涉物是否为常量”的任何暗示。
const char *pci;//指向常量的指针
char *const cpi=0;//常量指针
char const *pci2;//仍然是指向常量的指针
const char * const cpci=0;//指向常量的常量指针。
char *ip;//普通的指针
“C++标准规定允许进行‘增加常量性’的(无条件)类型转换”。举例来说,我们可以把一个指向非常量的指针复制到一个指向常量的指针。这样我们就可以——当然也可以做许多其他的事情——把一个指向char类型的非常量指针传递给标准库中的strcmp或strlen函数,尽管他们声明只接受指向char类型常量的指针,直觉上我们能够理解为什么可以这么做:允许指向常量的去指向非常量的(但本身不失其指涉物常量性),因为我们没有因此丧失任何数据声明时的约束,当然我们也能理解为什么逆向的转换被封印,因为这么一来我们就获取到了数据被声明时更多的权限;
size_t strlen(const char *);
//...
int i=strlen(cpi);//没问题参数传递
pci=ip;//也没问题指针赋值
ip=pci;//错误
请注意C++语言规范在数据常量性问题上采取一种保守的观点:其实这么说也可以——在不立即引起核心转储的前提下——我们可以修改指向常量指针所涉的数据,只要这些数据实际上(在未被指涉的语义中)并非常量①,或他们却是常量,但是运行该代码的平台并不把数据分配到内存储器的只读区域。总之常量性的典型用途是在设计期的一种立场表达,同时也是一种系统属性标示。C++语言看来会强制推行设计者的意图。
=============================================================
注释:
①译注:也就是说让一个声明为指向常量的指针指向一个本身不是常量的数据,那么就不能通过这个指向常量的指针来修改这个数据了,但是并不是说明这个数据不能修改。→参见常见错误6.
相关文章推荐
- Gotchas 6-对常量(性)的认识误区
- 常量指针、指针常量、C++类型转换
- 黑马程序员—Java编程基础+常量与变量+类型的转换+进制的转换+运算符+scanner的使用+程序流程结构控制+循环结构
- 代码疑云(11)——指针与类型转换
- 指针类型转换(非常棒非常全的一篇文章)
- Java中的变量与常量、基本数据类型及其类型转换
- JAVA第二章基础知识:注释,标识符,数据类型常量变量,基本数据类型转换。--------------(Make A little EvProgresseryday )
- 初识指针7(void类型指针的认识)
- 指针类型的向下转换和向上转换
- 利用指针进行类型强制转换(c指针详解)
- C++多重继承下的指针类型转换
- C#输入输出及类型转换,变量,常量。
- C++类型转换与this指针调整
- 2 Java基础语法(关键字,标识符,注释,常量,进制转换,变量,数据类型,数据类型转换)
- C# string类型转换成 指针类型或者句柄
- Java基础复习之一篇:关健字,标识符,注释,常量,进制转换,变量,数据类型,数据类型转换
- C/C++强制类型转换、指针类型转换发生了什么
- 关于内存和指针操作,数据类型转换本质的理解
- C语言中不同类型的结构体的指针间可以强制转换
- Java标识符,注释,数据类型,变量,常量,数据类型转换