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

简介: 【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;
}

运行结果:

image.png

那如果我不希望n的值被改变呢?

这时候就需要我们的const

代码示例:

int main()
{
  const int n = 10;
  n = 20;//把20赋值给n
  printf("%d\n", n);
  return 0;
}

运行结果:

image.png

这时候运行就会报错;

懂了吗?

3、修饰指针

const放在*号左边

我们再来看一段代码

int main()
{
  const int n = 10;
  int* p = &n;
  *p = 20;
  printf("n=%d\n", n);
  return 0;
}

运行结果:

image.png

咦?为什么改变了呢?

我们想要的结果是,不能改变n的值,结果用指针的方法竟然可以修改!!!

打个比方:我不允许你从大门进来,结果你翻窗户进来了

那么我们是不允许这种事情发生的!

所以我们对代码进行修改:

int main()
{
  const int n = 10;
  const int* p = &n;
  *p = 20;
  printf("n=%d\n", n);
  return 0;
}

运行结果:

image.png

此时运行编译就会报错;

左值指定为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;
}

运行结果:

image.png

可以看到虽然*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;
}

运行结果:

image.png

所以const放在*号的右边,修饰的是p;修饰的是指针变量不能再被改变了;

4、小故事

其实const修饰变量很好理解,但是修饰指针理解起来还是有点困难;

所以我举个例子吧!

如图:

image.png

此时 p = &n,说明女孩p和男孩n之间建立了男女关系;

image.png

当建立好关系以后,女孩就对男孩说:”旁边有家奶茶店,你给我买杯奶茶吧“

因为喝一杯奶茶要10元钱,意味着:*p = 0;就相当于把男孩的10元钱花掉了;

此时男孩心想:”哎呀,要花我10元钱呀,不行,我不愿意!“;

那么男孩就很聪明,在*号的左边加了一个const

image.png

这时候,女孩想喝奶茶也喝不上;男孩在兜里把10元钱拽的紧紧的!

于是乎,女孩就生气了呀,心想:”连10元钱的奶茶都不请,我得换男朋友了!“

此时女孩发现有一个男孩m,兜里有100元,也愿意请我喝奶茶;

image.png

那么p = &m这个动作就可以换男朋友了;

虽然女孩不能影响男孩n兜里的钱,但是女孩可以换男朋友;

女孩现在不指向男孩n了,而是去指向男孩m了:

image.png

此时男孩n慌了,心想:”这不行呀!既然你要换男朋友,那么我们再约定一下!“

男孩n对女孩说:”我可以请你喝奶茶,但是你不能换男朋友!”

既然不能换男朋友,那么我就要限制p,于是把const移到了*号的右边:

image.png

此时*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

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

哈哈哈,是不是有点绕…

相关文章
|
17天前
|
C语言
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
|
17天前
|
编译器 C语言
操作符详解(C语言基础深入解析)
操作符详解(C语言基础深入解析)
|
1天前
|
监控 Linux 数据处理
|
11天前
|
存储 程序员 C语言
【C 言专栏】C 语言指针的深度解析
【4月更文挑战第30天】C 语言中的指针是程序设计的关键,它如同一把钥匙,提供直接内存操作的途径。指针是存储其他变量地址的变量,通过声明如`int *ptr`来使用。它们在动态内存分配、函数参数传递及数组操作中发挥重要作用。然而,误用指针可能导致错误,如空指针引用和内存泄漏。理解指针的运算、与数组和函数的关系,以及在结构体中的应用,是成为熟练 C 语言程序员的必经之路。虽然挑战重重,但掌握指针将增强编程效率和灵活性。不断实践和学习,我们将驾驭指针,探索更广阔的编程世界。
|
17天前
|
存储 C语言
指针深入解析(C语言基础)带你走进指针,了解指针
指针深入解析(C语言基础)带你走进指针,了解指针
|
17天前
|
存储 编译器 C语言
C语言基础知识:数据在内存中的存储解析(整数,浮点数)
C语言基础知识:数据在内存中的存储解析(整数,浮点数)
|
17天前
|
C语言 C++
C语言:指针运算笔试题解析(包括令人费解的指针题目)
C语言:指针运算笔试题解析(包括令人费解的指针题目)
|
17天前
|
机器学习/深度学习 C语言
函数递归深入解析(C语言)
函数递归深入解析(C语言)
|
17天前
|
编译器 C语言
函数深入解析(C语言基础入门)
函数深入解析(C语言基础入门)
|
1天前
PandasTA 源码解析(二十三)
PandasTA 源码解析(二十三)
7 0

推荐镜像

更多