文章目录
1、const的用法
const
是constant的缩写,意思是“恒定不变的”,它是定义只读变量的关键字。
const
:修饰变量const
:修饰指针
2、修饰变量
其实修饰变量很好理解,用const定义的变量的值是不允许改变的,不允许给它重新赋值,即使是赋相同的值也不可以。
所以说它定义的是只读变量;
这也就意味着必须在定义的时候就给它赋初值,如果程序中试图改变它的值,编译的时候就会报错。
代码示例:
int main() { int n = 10; n = 20;//把20赋值给n printf("%d\n", n); return 0; }
运行结果:
那如果我不希望n的值被改变呢?
这时候就需要我们的const
了
代码示例:
int main() { const int n = 10; n = 20;//把20赋值给n printf("%d\n", n); return 0; }
运行结果:
这时候运行就会报错;
懂了吗?
3、修饰指针
const放在*号左边
我们再来看一段代码
int main() { const int n = 10; int* p = &n; *p = 20; printf("n=%d\n", n); return 0; }
运行结果:
咦?为什么改变了呢?
我们想要的结果是,不能改变n的值,结果用指针的方法竟然可以修改!!!
打个比方:我不允许你从大门进来,结果你翻窗户进来了
那么我们是不允许这种事情发生的!
所以我们对代码进行修改:
int main() { const int n = 10; const int* p = &n; *p = 20; printf("n=%d\n", n); return 0; }
运行结果:
此时运行编译就会报错;
左值指定为const对象,*p
就不能被修改了
所以const
放在*
号的左边,修饰的是*p
;修饰的是指针所指向的对象不能再被改变了;
const放在*号右边
那么当const放在*
号的右边呢?
再来看一段代码:
int main() { int m = 100; const int n = 10; const int* p = &n; p = &m; printf("%d\n", &m); printf("%d\n", p); return 0; }
运行结果:
可以看到虽然*p
不能被修改,但是p
可以被修改;
所以我们对代码进行修改:
int main() { int m = 100; const int n = 10; int* const p = &n; p = &m; printf("%d\n", &m); printf("%d\n", p); return 0; }
运行结果:
所以const
放在*
号的右边,修饰的是p
;修饰的是指针变量不能再被改变了;
4、小故事
其实const
修饰变量很好理解,但是修饰指针理解起来还是有点困难;
所以我举个例子吧!
如图:
此时 p = &n
,说明女孩p和男孩n之间建立了男女关系;
当建立好关系以后,女孩就对男孩说:”旁边有家奶茶店,你给我买杯奶茶吧“
因为喝一杯奶茶要10元钱,意味着:*p = 0
;就相当于把男孩的10元钱花掉了;
此时男孩心想:”哎呀,要花我10元钱呀,不行,我不愿意!“;
那么男孩就很聪明,在*
号的左边加了一个const
:
这时候,女孩想喝奶茶也喝不上;男孩在兜里把10元钱拽的紧紧的!
于是乎,女孩就生气了呀,心想:”连10元钱的奶茶都不请,我得换男朋友了!“
此时女孩发现有一个男孩m,兜里有100元,也愿意请我喝奶茶;
那么p = &m
这个动作就可以换男朋友了;
虽然女孩不能影响男孩n兜里的钱,但是女孩可以换男朋友;
女孩现在不指向男孩n了,而是去指向男孩m了:
此时男孩n慌了,心想:”这不行呀!既然你要换男朋友,那么我们再约定一下!“
男孩n对女孩说:”我可以请你喝奶茶,但是你不能换男朋友!”
既然不能换男朋友,那么我就要限制p
,于是把const
移到了*
号的右边:
此时*p = 0
可以执行,但是p = &m
不能执行;
但是如果你遇到了一个男朋友:const int* const p = &n
;那么你可以放弃了!
因为在*
号的左右各加一个const
,表示:这个男孩既不请你喝奶茶,又不让你换男朋友!
这下李姐了吗?
5、总结
-
const int* p
:const
放在了*
的左边,修饰的是*p
,使得*p
不能通过p
来改变,但是p
可以被改变;
-
int* const p
:const
放在了*
的右边,修饰的是p
,p
不能被改变,但是*p
可以被改变;
-
const int* const p
:p
和*p
都不能被修改;
6、思考
理解了const
修饰 变量 和 修饰 指针的含义后,那么看看下面这段代码的意思呢?
代码示例:
int main() { int a = 10; int* pa = &a; const int* const* const ppa = &pa; return 0; }
我是这样理解的:
*ppa
即pa
;
**ppa
即a
;
也就是二级指针本身指向不能改,二级指针所指向的指针的指向也不能改
哈哈哈,是不是有点绕…