【C++Primer笔记】顶层const、常量指针
之前对到底怎样写是常量指针(顶层const),怎样写不是,怎样写又是语法错误很糊涂,现在做个笔记。
《C++ Primer》原文:很多程序员容易迷惑于基本数据类型和类型修饰符的关系,其实后者不过是声明符的一部分罢了。
个人理解:int是基本数据类型,*是类型修饰符,*p是声明符。
先总结一下各种情况:
1 int const *p1;//正确,是指向常量的指针 2 3 const int *p1;//正确,是指向常量的指针 4 5 int *const p1;//错误,常量指针必须初始化 6 7 *const int p1;//语法错误 8 9 *int const p1;//语法错误 10 11 const* int p1;//语法错误,以上是*、const和int的六种排列组合 12 13 14 15 using iptr=int*; 16 17 const iptr p1;//错误,常量指针必须初始化 18 19 iptr const p1;//错误,常量指针必须初始化 20 21 22 23 using cptr=const*;//实际上等价于using cptr=const int*; 24 25 cptr p1;//正确,是指向常量的指针 26 27 int cptr p1;//语法错误 28 29 cptr int p1;//语法错误 30 31 32 33 using cptr= *const;//语法错误 34 35 using iptr= *int;//语法错误
综上,可知const直接修饰右边的声明符:
int const *p1;const int *p1;
两句中的const都是修饰*p1,也就是说*p1不可变,但p1可以变,指针指向的值不可变,指针指向的内存地址可变
int *const p1;
这里const修饰p1,所以是常量指针
using iptr=int*;const iptr p1;
这里的const和上一例一样
其实迷糊的根本就在于当初学的时候
int *p=0;
这一行代码没彻底弄明白
对于*而言,*自己觉得自己就是来提醒一下p你是用来存储内存地址的,这时候*是类型修饰符
而对于int而言,int觉得自己是修饰*p的,所以p指向的内存里面必须存储int类型的变量,这时候*是解引用符
同样,const修饰p,就成了常量指针,修饰*p,就成了指向常量的指针。
不管是什么const int* p还是int *const p,只要看清楚*和变量名能不能黏到一块去,或者说前面的类型说明符到底是修饰*p还是p的,就能弄清楚含义了
今天下午开工了个如何理清楚逻辑的一点感想,对于这篇文章而言,思路清晰的关键就是要知道*在一行代码里的两种含义。
又想到了一点:
《C++ Primer》里面提到所谓指向常量的指针,只是指针以为自己指向的是常量,所以拒绝通过解引用的方式改变指向的对象的值,但实际上那个对象是不是常量,指针表示无所谓
结合https://blog.csdn.net/simba228/article/details/6804083中所说:
”const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。“
于是一切都豁然开朗起来:
我define了pi是3.14,但是我在代码里面还是可以写c=3.14*d;
我定义了一个指向常量的指针,但天知道那个指针指向的对象到底是不是常量呢~
说不定对象的心早就变了,可怜的底层const还在以为自己指向的是常量······
在这里我们为底层const默哀一秒,祝天下渣男渣女原地爆炸(笑)~~~~~~~