写点什么

【C 语言深度剖析】深入理解 const 的用法(趣味小故事解析)

作者:Albert Edison
  • 2022 年 9 月 14 日
    四川
  • 本文字数:1678 字

    阅读完需:约 6 分钟

【C语言深度剖析】深入理解const的用法(趣味小故事解析)

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* pconst放在了*的左边,修饰的是*p,使得*p不能通过p来改变,但是p可以被改变;

  • int* const pconst放在了*的右边,修饰的是pp不能被改变,但是*p可以被改变

  • const int* const pp*p都不能被修改;

6、思考

理解了const修饰 变量 和 修饰 指针的含义后,那么看看下面这段代码的意思呢?


代码示例:


int main(){  int a = 10;  int* pa = &a;
const int* const* const ppa = &pa;
return 0;}
复制代码


我是这样理解的:


*ppapa


**ppaa


也就是二级指针本身指向不能改,二级指针所指向的指针的指向也不能改


哈哈哈,是不是有点绕......

发布于: 2022 年 09 月 14 日阅读数: 33
用户头像

Albert Edison

关注

目前在某大厂担任后端开发,欢迎交流🤝 2022.03.08 加入

🏅️平台:InfoQ 签约作者、阿里云 专家博主、CSDN 优质创作者 🛫领域:专注于C语言、数据结构与算法、C++、Linux、MySQL、云原生的研究 ✨成就:2021年CSDN博客新星Top9,算法领域优质创作者,全网累计粉丝4W+

评论

发布
暂无评论
【C语言深度剖析】深入理解const的用法(趣味小故事解析)_指针_Albert Edison_InfoQ写作社区