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与指针组合在一起, ...
随机推荐
- IDEA中lombok插件的安装
1.在pom.xml中添加依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId&g ...
- Spring Boot集成Spring Data Reids和Spring Session实现Session共享
首先,需要先集成Redis的支持,参考:http://www.cnblogs.com/EasonJim/p/7805665.html Spring Boot集成Spring Data Redis+Sp ...
- 春哥的nginx systemtap调试脚本简单介绍
http://card.weibo.com/article/h5/s#cid=2304185311ad2d0102v9gd&vid=0&extparam=&from=11100 ...
- Mysql 性能优化20个原则(2)
5. 在Join表的时候使用相当类型的例,并将其索引 如果你的应用程序有很多 JOIN 查询,你应该确认两个表中Join的字段是被建过索引的.这样,MySQL内部会启动为你优化Join的SQL语句的机 ...
- PS 图层后面有索引两字怎么办
ps中图层后面有索引两字的怎么把它拖进别的图中?或怎么把索引去掉? 悬赏分:0 | 解决时间:2010-11-5 08:58 | 提问者:jk500pk 最佳答案 图像--模式 把索引颜色模式改成RG ...
- php闭包实例
php闭包函数,一个典型的实例 function getMoney() { $rmb = 1; $dollar = 6; $func = function($dollar) use (&$rm ...
- hud 1465、2049、2045 (递推)[含简单C(n,m) n!的写法]
C - 不容易系列之一 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- 基于bootstrap_后台管理
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- String、StringBilder和StringBuffer之间的区别
1.三者在执行速度方面的比较:StringBuilder > StringBuffer > String 2.String <(StringBuffer,StringBuild ...
- 【特征检測】BRIEF特征点描写叙述算法
简单介绍 BRIEF是2010年的一篇名为<BRIEF:Binary Robust Independent Elementary Features>的文章中提出,BRIEF是对已检測到的特 ...