【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默哀一秒,祝天下渣男渣女原地爆炸(笑)~~~~~~~

 

posted @ 2020-08-03 22:35  人&月's神话  阅读(266)  评论(0编辑  收藏  举报