前言
在指针的学习中,const算是一个十分重要的知识点,但大部分的人在初学时都是对它一知半解,只是浅浅地记一下它的作用,没有深入了解,但在以后的学习中,从内存上深层次地理解const是如何修饰指针变量还是很有必要的。
1.const修饰变量
const翻译是常量的意思,先以一个普通常量来观察const的作用,如图:
对比两张图不难看出,被const修饰过的变量a无法被修改,这就是const的作用了:
通过在变量前面加 "const" 关键字,可以将该变量声明为常量,也就是说不允许对它进行修改。但是被const修饰过后,语法上a被声明为一个常量,但a的本质还是变量,只不过被const修饰过后,a具有了常属性,所以才不能被修改,因此通常我们也将a这一类的变量称为:常变量。
2.const修饰指针变量
知道const的作用后,先来看一段简单代码:
先弄清楚p,&p,a之间的关系。看图:
总结一下,
p (指针变量):1.有自己的地址;2.有自己的空间;3.自己空间里存放的是a的地址;
a(变量):1.有自己的地址;2.有自己的空间;3.自己空间里存放的是a的值;
*p:p指向的空间(a的空间);
知道这些后,再来看const修饰指针变量的3种情况:
1)const修饰*p(const在*的左边)
这两种情况是一样的,都是在*的左边。此时const的作用是修饰*p,也就是说,*p被修饰后,无法通过p来改变p指向空间的内容。
对比:
无const:
有const:
此时*p,也就是p指向的空间(a的空间)被固定了,无法通过改变*p来改变a的值。但是p(指针变量)是不受限制的,如:
也就是说,p(指针变量)的空间里可以存放不同的地址,也就是p可以指向不同的空间,但无法通过p来改变p指向空间里的内容。
2)const修饰p(const在*的右边)
const修饰p就是与const修饰*p反着来:
p的空间里只能存放a的地址,但是可以通过p来改变a的值。
看图:
const修饰p后:
(1) 只能存放a的地址:
(2)可以通过p来改变a的值:
3)const既修饰*p又修饰p(既在*的左边又在*的右边)
也没什么好说的,就是两个合并:
p的空间里既只能存放a的地址,又无法通过p来改变p指向空间里的内容(a的值)。
看图: