关于Const指针的一点补充
2012-05-10 13:30
113 查看
OsChina上一个朋友给出的例子,很能说明问题:
如果把CharPtr替代掉的话,那么似乎[1]是错的,[2]是对的,因为const char *是指向const char的指针,指针可以指向别的,但是指向的内容不能变。实际上,const只是编译器的一种规范,所以编译的时候只按照语法检查是不是改变了,char*被typedef之后,可以当成一种简单类型看,那么const CharPtr 就只一个CharPtr型的常量,对它的赋值肯定会引起编译错误,而[0]这种寻址并不影响。
不过,如果把typedef 改为宏替换(如下),事情就不一样了,毕竟宏替换只是一种替换而已,不会引起编译器的检查,编译之前,CharPtr就已经被替换掉了。
typedef char * CharPtr; const CharPtr mycharptr = "Hello, World"; mycharptr[0]='h'; //OK[1] mycharptr = "It's Wrong"; //Err[2]
如果把CharPtr替代掉的话,那么似乎[1]是错的,[2]是对的,因为const char *是指向const char的指针,指针可以指向别的,但是指向的内容不能变。实际上,const只是编译器的一种规范,所以编译的时候只按照语法检查是不是改变了,char*被typedef之后,可以当成一种简单类型看,那么const CharPtr 就只一个CharPtr型的常量,对它的赋值肯定会引起编译错误,而[0]这种寻址并不影响。
不过,如果把typedef 改为宏替换(如下),事情就不一样了,毕竟宏替换只是一种替换而已,不会引起编译器的检查,编译之前,CharPtr就已经被替换掉了。
#define CharPtr char *
const CharPtr mycharptr = "Hello, World"; mycharptr[0]='h'; //Err mycharptr = "It's Wrong"; //OK
相关文章推荐
- 关于Const指针的一点补充
- 关于广播注册方式的一点补充
- 关于使用TestDriven.Net 2.0的一点补充
- 关于对孟子E章《利用Repeater控件显示主-从关系数据表》的一点补充(转)
- 关于asp.net无刷新联动的一点补充说明
- 关于线程的一点补充
- 关于lexical_cast,一点补充
- 关于爬虫Demo的一点补充
- 关于使用TestDriven.Net 2.0的一点补充
- [导入]关于孟子E章《利用Repeater控件显示主-从关系数据表》的一点补充
- 关于广播注册方式的一点补充
- 关于用vs.net 2005强类型DataSet构建全文搜索的一点补充!!!
- 关于lexical_cast,一点补充
- 关于二叉树的一点补充。
- 关于前一篇innodb自增列自己的一点补充
- 关于caffe学习系列的一点补充——如何将float类型的特征数据存入lmdb
- 游戏运营杂谈之---->关于充值和促销的一点补充想法
- 关于在组件GIS开发中使用Python的一点补充说明
- 关于MIUI悬浮窗权限问题的解决方案的一点补充
- 关于Python2与python3共存的一点补充