文章起源:在复习C语言的时候复习到了const(声明只读变量)关键字,向外扩展到了常量指针以及指针常量,出现了几个疑惑的地方:
1.常量指针和指针常量是什么;
2.常量指针和指针常量为什么这么命名;
3.const是修饰谁的;
4.const int * n; int * const p;是从左到右还是从右到左读;
正文开始:
1.常量指针和指针常量
指针常量
int * const p;
指针常量中const的作用是限制指针不可变,也就是说指针一旦初始化不可再更改,但是其指向对象的值是可变的
常量指针
const int *p;
int const* p;
这两种写法是一样的,常量指针中const的作用和指针常量中互补,其限制的是常量不可变,也就是说指针初始化后可以修改其指向,但是无法修改对象的值
大致好像明白了什么意思又好像没明白什么意思
就是指针常量 指针指向不可以改变可以修改指向内容的值
常量指针是指 指针指向可以改变但不可以修改指向内容的值
明白了指针常量以及常量指针后我就想起了多级指针修饰从内到外那这个const是修饰谁的,并且为什么这样命名。
2.常量指针和指针常量为什么这么命名
指针常量:
int * const p;
观察一下其形式,发现*号在左,const在右,我们从左往右读,“*”号读作“指针”,“const”读作“常量”,所以总的读作:“指针常量”。
常量指针:
const int *p;
int const* p;
观察发现,常量指针中const 总是位于*号左侧,所以我们按照上面的方法依次从左往右读,合并起来就是“常量指针”。
OKOK大家应该知道怎么读了,对常量指针和指针常量印象中也加深了一些那我们接着往下探索
3.const修饰谁的
为什么要探索这个,因为我感觉弄清楚了修饰关系,那么对常量指针以及指针常量到底谁能改地址能改变量也就更加清晰了。
我们从常量指针开始分析
指针常量:
int * const p;
首先这里介绍一下 *p、p、&p这三个是什么
*p 是指针变量p指向的变量的存储内容
p 是指针变量的存储内容
&p 对本身p进行取地址
有点懵,我也有点懵什么*p、p存储内容
所谓的*p就是p存储地址内存放的变量
本人感觉p就是地址,*p指向的是变量,&p就是将p地址进行取地址操作(如果有些偏差请指正)
那根据我的理解咱们分析一下指针常量
*const p就是说指针的地址不可改变了,然后是一个int(指向整型)那么就是说地址不可以改变,指针指向的内容可以改变
常量指针:
const int *p;
int const* p;
那么常量指针也是一样的 *p是指针变量p指向的变量的存储内容,const int修饰内容那么内容就不可以改变了,但是地址可以改变
这样理解的话可以方便记忆
4.const int * n; int * const p;是从左到右还是从右到左读;
当然是从左到右读啦!
从右到左读!!!!!
为什么从右到左读我们总结上面说的三点
1.int * const p;
2.const int *p;
3.int const* p;
1. p是一个const指针指向int型,那么p的本身就不能修改
2. *p指向 const int 类型,那么*p指向的对象就不可以修改
3. *p指向 int const类型,那么*p指向的对象就不可以修改