在接触指针常量和常量指针时,在学过很多次依然会混淆,偶然突然对此有点自己的理解,以此来记录下。
前置知识:
我们比较吐槽的是指针在定义时必须加上*
这个符号,如下:
int a = 10;
int *ptr = &a;
当我们想要修改指针所指向变量的值时,是这样做的:
*ptr = 20;
这与我们定义时的并不一样。
同时当我们想要修改指针的指向时,是这样做的:
int b = 30;
ptr = &b;
本质上指针是一个存储了地址符的指针类型变量。
因此当你使用*ptr
时,实际上就是调用其所指向的对象,通常称为解引用。
所以我们只需要告诉自己,指针的定义比较特殊,不使用*
无法将其与普通变量区分开来。特殊使用指针的定义即可,其余的部分就可以正常理解了。
而在指针常量和常量指针这个部分学习时,我经常弄混,甚至在看过多次后仍然无法记住,下面给出一个我个人认为比较好的理解办法。
定义:
指针常量:int * const p
本质是告诉编译器指针类型的变量是一个常量。
常量指针:const int *p
或者 int const *p
本质是告诉编译器指针p
所指向的变量是不可以通过指针p
来修改值的,即对于指针p
来说,其所指向的变量*p
是一个常量。
书写方式:
那么给出这两个名词时,我们只需要先写出其形式,然后看其中*
是否与p
贴贴即可。我们在书写时先不考虑具体是什么基本数据类型的指针,那么只存在三个名词:const
,*
,p
。
其中p
一定是放在最后的,*
代表指针,const
代表常量。按照名词的表达顺序写出即可判断,最后加上基本数据类型即可。
指针常量:* const
所以整体是int * const p
常量指针:const *
所以整体是int const * p
,或者const
也可提前即:const int * p
具体分辨:
指针常量:const
后面是一个p
,一个指针类型变量,其存储的为指向变量的地址,不可改变p
的值,即指针的指向不变。
常量指针:const
后面是一个*p
,上面所说过*p
就是一个变量,所以不可改变这个变量的值,即不可通过指针p
的解引用来改变其所指向变量的具体值。
所以以后如果分不清的时候,就可以这样做啦~
写给以后又分不清两者的自己~