十分钟深入理解const用法(趣味故事)

简介: 十分钟深入理解const用法(趣味故事)

1、c标准


1、首先我们来了解一下现在所学的C标准,分别是C89、C99和C++99,C89标准的C语言中的const和C++中的const是有区别的,而在C99标准的C语言中是相同的。我们目前所学的C语言标准为C89标准。

2、在C语言(C89)中的const可以不初始化但后续也就无法对其赋值,所以尽管不初始化不会出错。但要使用const修饰的量就需要对其进行初始化。


2、const的用法


const:为constant的缩写,它修饰的量为一个常量即不能被修改的量。


修饰变量

修饰指针


3、修饰变量


修饰变量指的是,用const定义的变量不能随意改变,所以称它为只读变量


举个例子:


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


运行结果可见↓

2d65d23f6d4748949b924e4057485923.png

可见const修饰的变量不能随意改变!


4、修饰指针


🍅const* p


既然const修饰的变量不能随意改变,我们是不是可以通过修改n的地址:int * p=&n,*p=20


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


const修饰的n不能改,结果把&n的值修改了!

这种方式是不是在间接破坏const呢?打个比方


我不允许你从大门进来,结果你把窗户打碎了进来


我们不允许这种无赖的行为发生,所以我们对*p进行修改:const int * p = &n;


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

0a2653c851af460fa595bd959398a8f1.png

这时候说明const可以修饰指针

所以当const放在*的左边的时候(const int* p) == (const * int p)

修饰的是*p;修饰的是指针所指向的对象不能再被改变了;但p变量中的地址是可以改变的。


🍅*const p


那换个方式思考,我们把const放在*的右边呢?


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

2d65d23f6d4748949b924e4057485923.png

所以当const放在*的右边的时候(int * const p)

修饰的是p;表示p的内容不能被改变,但是p指向的对象是可以通过p来改变的。


5、趣味小故事


举一个恋爱花钱小故事来深入理解一下吧


0a2653c851af460fa595bd959398a8f1.png


int *p = &M,说明女孩p和李泽言M谈恋爱了;


2d65d23f6d4748949b924e4057485923.png


谈恋爱以后,女孩就对男孩说:”你请我吃麦旋风吧“


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


此时这个男孩比较抠门,不愿意把十块钱花掉;


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


6de278e6d6694ce5bb08e7e842b7e74b.png


女孩发现男孩M连一个把麦旋风都不请他吃,毅然决然的分手,于是通过*p=&n换了一个有一百块钱的男朋友n(白起)


8ec4f2997fb246878c34ecd6d122b7c6.png


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


男孩M对女孩说:”我可以请你吃,不过你不能换男朋友!”


男孩M于是把const移到了*号的右边;


0a2653c851af460fa595bd959398a8f1.png


此时p = 0可以执行,但是p = &m不能执行;

但是如果你遇到了一个男朋友:const int const p = &n;那么你可以分手了

说明这个男孩既不请吃东西,又不让你换男朋友!渣男!!


6、总结


const int* p:const放在了*的左边,修饰的是*p,使得*p不能通过p来改变,但是p可以被改变;

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

const int* const p 既不能改变p,也不能改变*p。渣男!!


相关文章
|
6月前
|
缓存 前端开发 JavaScript
整会promise这8个高级用法,再被问倒来喷我
整会promise这8个高级用法,再被问倒来喷我
整会promise这8个高级用法,再被问倒来喷我
|
5月前
|
JavaScript
一篇文章讲明白js获取当前时间(昨天、今天、明天)
一篇文章讲明白js获取当前时间(昨天、今天、明天)
400 0
|
5月前
|
JavaScript 前端开发
杨校老师课堂之JavaScript定时器案例的红绿灯设计--原始写法
杨校老师课堂之JavaScript定时器案例的红绿灯设计--原始写法
36 0
|
6月前
|
JavaScript 前端开发 索引
经常混,还是记下来吧,forin和forof的用法
经常混,还是记下来吧,forin和forof的用法
|
6月前
|
JavaScript 小程序 前端开发
JS将时间戳转换为刚刚、N分钟前、今天几点几分、昨天几点几分等表示法
JS将时间戳转换为刚刚、N分钟前、今天几点几分、昨天几点几分等表示法
102 0
|
设计模式 JavaScript 前端开发
【再来亿遍 温故知新】—— 关于 JS 原型你必须要知道的二三
本瓜一向认为:学习不是一蹴而就的事情。一定是要求学习者对知识点进行反复咀嚼拿捏、不断打破重塑,长此以往,才以期达到融会贯通、为我所用的程度。所谓:温故知新,不亦乐乎?
|
前端开发
#yyds干货盘点 【React工作记录二十三】如何进行时间戳的大小比较
#yyds干货盘点 【React工作记录二十三】如何进行时间戳的大小比较
96 0
|
C++
爱上c++的第十天:共用数据的保护(const)
最近事情还是比较多,我的心态也出现了一些小问题,目前也在积极的调整,想学的东西太多,但是又不是那么容易学,不可避免的产生了一些消极的态度,老师也是对我很好,帮助我调整状态,很快我也会慢慢的持续变好,我自己也相信自己。好了,开始我们今天的学习。
96 0
|
机器学习/深度学习 算法 编译器
明天省赛,我都还不太熟悉Dev - C++,怎么切换成C++11了?它的报错看不懂呀,那花八分钟看看这篇文章吧~解决你的困惑。
明天省赛,我都还不太熟悉Dev - C++,怎么切换成C++11了?它的报错看不懂呀,那花八分钟看看这篇文章吧~解决你的困惑。
1223 0
明天省赛,我都还不太熟悉Dev - C++,怎么切换成C++11了?它的报错看不懂呀,那花八分钟看看这篇文章吧~解决你的困惑。
|
前端开发
#yyds干货盘点# 【React工作记录六十】return false得使用
#yyds干货盘点# 【React工作记录六十】return false得使用
106 0
#yyds干货盘点# 【React工作记录六十】return false得使用