C++中const限定符与指针
来源:互联网 发布:直男癌语录 知乎 编辑:程序博客网 时间:2024/06/06 20:35
最近在看《C++ Primer》,看到const限定符与指针的关系之时,感觉绕的云里雾里。细细体味之后,感觉到了其中的奥秘,于是写了一份学习心得,供大家学习时参考~共同学习,共同进步呐~
const与指针之间的交互过程分为两部分:1. 指向const对象的指针;2. const指针。所以“const指针”这个名字不是能乱叫的,不能作为const与指针使用时的统称。
1. 指向const对象的指针
如果指针指向的对象时const类型的,此对象不能被修改。但是,如果通过指针指向此对象修改行不行呢?是可以的。所以C++是不会让他得逞的,于是C++强制要求指向const对象的指针也要有const特性。注意此时const写在原来指针的类型之前,作用是“不能用此指针改变指向对象的值”例如:
const double pi = 3.14 ;const double *p = &pi ;
从此,你就再也不能通过指针p指向pi的内容,从而来修改pi的内容。
但是,如果一个不是指向const类型对象的指针,能不能使用const来限定呢?答案是可以的。因为这里的const限定是一种“自以为指向const的指针”,异常傲娇……它是一厢情愿的认为:我限定的指针就是指向const对象的!!!同时,此指针本身的值可以改变(指针本身可以改变赋值)例如:
double dval = 3.14 ;p = &dval ;
这种限定是正确的,但是dval是可以改变值的,p的值也是可以改变的。但是如果使用p指针指向,指向dval值之后进行改变,这样就不允许了。因为p站在自己的角度上,还是固执地认为“自以为”dval是const对象。
实际程序中,指向const的指针常用作函数的形参。将形参定义为指向const的指针,以此确保传递给函数的实际对象在函数中不因为形参而被修改。
注意:号称能声明任务对象的void(见本书 chapter 4.2.2)在此处也要吃瘪。不能用void*指针,只能使用const void*类型指针保存const对象的地址。
2. const指针
上一种使用的方法目的是使得“指向的目标对象不被修改”,但是指针本身是可以更改值的。但是C++还提供另外一种const指针,指针本身的值不能修改。即const指针:
int num = 0 ;int *const cur = &num ;
此时写const的位置挪到了原指针的星号之后了。此时这个指针变成了自身不能改变值的const指针。而且这种const指针必须在定义时初始化。初始化之后不允许赋值,甚至不允许赋回以前的值。;例如如下错误:
cur = cur ;
真是丧心病狂……总是这种const指针你就只拿来用就别改了。但是指针本身不能修改,这种指针指向的对象还是可以修改的,而且可以通过这个指针进行修改。
*cur = 1 ;
以上语句是可以通过的。总之,const指针是一个严于律己宽以待人的指针,只管自己不能改,指向的对象可以改,而且还能通过自己改。
3. 指向const对象的const指针
综合以上两种类型,于是我们可以得到指向const对象的const指针:
const double pi = 3.14 ;const double *const p = &pi ;
这种书写比较操蛋……读起来需要从右向左,也就是:p是一个const指针,也就是说p不能再指向别的值;咦!p指向的对象还是个const对象呐么么哒,于是想用p指针对此对象进行改变赋值的行为也可以滚粗呐~
4. 指针和typedef
以上这些东西绕来绕去的很麻烦,于是大家可以巧妙使用下typedef类型来简化操作。但是大家记得一件事:typedef不是简单的英文缩写,所以:
typedef string *pstring ;const pstring p ;
其实,p不想再隐瞒了,它是真实身份是 string *const p,绝对不是什么 const string *p,大家只要记清楚这一点就好呐~
今天的问题就讲到这里了,大家有问题欢迎交流~
- C++中指针与const限定符
- C++中const限定符与指针
- 指针与const限定符
- 指针与const限定符
- 指针与const限定符
- 指针与const限定符
- 指针与const限定符
- 指针与const限定符
- 指针与const限定符
- 指针与const限定符
- 指针与const限定符
- 指针与const限定符
- 指针与const限定符(Linux C编程)
- C++中的指针与const限定符
- 万能const限定符与指针
- 万能const限定符与指针
- C++中const限定符和指针
- C++杂谈(一)const限定符与const指针
- 匿名管道与命名管道
- 数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器
- list练习实现
- PHP Charts 1.0 Remote Code Execution
- ubuntu linux下执行指定脚本不用输入密码
- C++中const限定符与指针
- Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解决办法)
- 抽象工厂模式二
- Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)
- 判断当前时间是否在限制时间段之内
- C#实现的ActiveX截图打印控件
- 教你如何迅速秒杀99%的海量数据处理面试题
- this 关键字的几种用法
- Plesk PHP Code Injection