const 和指针
c++用了那么久,觉得 const 和指针配合到一起的时候就会有点点分不出来。
如下:
const Data* pData; Data const * pData Data * const pData const Data * const pData Data const * const pData
是不是有点晕?
我其实用得最多的是 const Data* pData, 也理解该语句是定义 pData指向的对象是不允许修改的(不能通过pData指针调用非const方法)。
那么Data * const pData 实际就是指针本身是不可修改的(你不能将该指针赋值成另一个地址)。
实际上只会出现3中情况.
一种修饰语义是将指针所指向的对象修饰为const.
一种修饰予以是将指针本身(值类型)修饰为const, 本质上像你定义一个 const long 一样。
最后一种是对象为const 同时指针也为const.
那么,上面那一串代码都可以对号入座。
简单的办法是:
const 关键字出现在 * 前面, 修饰的是对象
const 关键字出现在 * 后面, 修饰的是指针
好了,再分析之前的例子:
const Data* pData; //修饰对象 Data const * pData //修饰对象 Data * const pData //修饰指针 const Data * const pData //修饰对象 + 指针 Data const * const pData //修饰对象 + 指针
所以有那么多种写法,其实就是在*左边和右边的问题。
我们应该始终按自己的风格选择一种固定模式就好。
为什么const 出现在 * 左边是修饰对象而不是修饰指针
而为什么const 出现在 * 右边是修饰指针而不是修饰对象
要理解这个,需要先理解神射手理论
说有一个神射手,随意的在枪靶上,每隔1cm的地方打了一个眼。
这个枪靶上居住着一种二维生物。
经过很多该生物的宇宙年后,该生物中的科学家终于发明了太空飞船,开始探索自己的宇宙。
最后他们总结出他们的宇宙第一定律,就是每隔1cm的地方有个洞。
哈哈, 我忘记我是在哪看到这个段子的了,是3T还是BigBang. 但是我在思考const 为啥放左边表示修饰对象的时候想起这个故事来着。
不要在意这些细节,我真是一个很会自娱自乐的人。
const 和指针的更多相关文章
- C++中的const和指针组合
在C++里,const修饰指针有以下三种情况 (1)指针常量:即指向常量的指针 const int *p或者int const *p const在*前,,可以这样理解它的功能,因为const在*前, ...
- 面试集锦-常量,const, const 对指针的影响
在C语言中不可改变的数据(量)就是常量 在C语言中有三种常量 字面量(直接量),就是直接写出来的,从写法上就可以看出值与类型等,例如:19,123.456等 名字常量 ...
- C语言 const与指针
//const与指针 #include<stdio.h> #include<stdlib.h> void main(){ ; ; const int *p; p = & ...
- 弄清const与指针、引用之间的关系
const和 define在常量定义上的差别 在C++中,我们可以使用const 或者 宏define来定义常量.但是C++鼓励使用const定义常量,而不是宏define.原因有很多. 1.defi ...
- const修饰指针
关于const修饰指针的情况,一般分为如下4种情况: ; const int *a =&b; //情况1 int const *a =&b; //情况2 int* const a =& ...
- 指向const的指针和const指针
1.指向const的指针:const int *p 或 int const *p 解释:p是一个指针,指向const int类型的常量:指针指向的内容为常量,因此不能改变*p的值,但指针p可以改变,指 ...
- const 指针与指向const的指针
最近在复习C++,指针这块真的是重难点,很久了也没有去理会,今晚好好总结一下const指针,好久没有写过博客了,记录一下~ const指针的定义: const指针是指针变量的值一经初始化,就不可以改变 ...
- [001]const和指针
很经典的: const int* p: int* const p: 前者表示指针指向的值是const,指向的值不可变,但是指针本身是可变的:后者表示改指针是const,指针不可变,但是指向的值是可变的 ...
- C语言--const修饰指针解析
这种例子在我们平时编程时可能会很少用,但是在面试时被问的可能性就很大了. 用const修饰指针,常见的情况可以分为四种: 1.const int *p; // p 可变,p 指向的对象不可 ...
- 比较常见的const与指针的组合情况
1.对于普通的const与基本类型组合,都是表示的是这是一个常量, const int a; int const a; 表示的意思是一样的,a是一个常量,不可改变 2.对于const与指针组合在一起, ...
随机推荐
- HDU - 5973 Game of Taking Stones (威佐夫博弈 高精度)
题目描述: Two people face two piles of stones and make a game. They take turns to take stones. As game r ...
- vue之监听事件
一.v-on 可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码. 简写形式 用@代替 v-on: <button v-on:click="co ...
- rdb转为rdf
dump-rdf -f N-TRIPLE -b http://localhost:2020/ -o iswc.nt terrsearch.ttl
- tcp-time-wait-state
https://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux
- printf行缓冲区的分析总结
最近在客户那调试串口的时候,read串口然后printf打印,单字符printf,发现没有输出,后来想起来printf这些标准输入输出函数也是属于标准C库glibc的, 这里就要区分一下标准库函数和系 ...
- 在canvas上面拖拽对象。
原文:https://html5.litten.com/how-to-drag-and-drop-on-an-html5-canvas/ 下面作者的原始的版本会抖动一下(鼠标刚点下去的时候,位置会发生 ...
- [WASM] Run WebAssembly in Node.js using the node-loader
WebAssembly is great for targeting performance bottlenecks in the browser. Now with node-loader, we ...
- 用 centrifugo 搭建 消息推送服务器 docker + rancher 搭建
关于消息推送服务器 目前有很多第三方的开放成熟的推送服务.鉴于项目需要 我们项目需要自己搭建 自己的推送服务. 我们的推送应用场景 聊天消息 项目内部消息提醒 移动设备接受消息 应用到的相关软件工具知 ...
- ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方式
原来定位服务是10分钟收不到定位信息就挂起定位,如今变为最短3分钟,预计都是为了省电吧. 仅仅要你开启应用的后台定位,而且10分钟有一次定位,那么苹果就不会关闭你的线程.如今变成3分钟.若你的应用开启 ...
- 【转载】C#扫盲之:静态成员、静态方法、静态类、实例成员及区别
文章目录 1.静态成员.实例成员 2.静态类 3.类的静态成员和非静态成员区别 --------------------------------------分割线------------------- ...