十分钟深入理解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。渣男!!


相关文章
|
8月前
|
缓存 前端开发 JavaScript
整会promise这8个高级用法,再被问倒来喷我
整会promise这8个高级用法,再被问倒来喷我
整会promise这8个高级用法,再被问倒来喷我
|
3月前
|
存储
让星星⭐月亮告诉你,HashMap的put方法源码解析及其中两种会触发扩容的场景(足够详尽,有问题欢迎指正~)
`HashMap`的`put`方法通过调用`putVal`实现,主要涉及两个场景下的扩容操作:1. 初始化时,链表数组的初始容量设为16,阈值设为12;2. 当存储的元素个数超过阈值时,链表数组的容量和阈值均翻倍。`putVal`方法处理键值对的插入,包括链表和红黑树的转换,确保高效的数据存取。
68 5
|
7月前
|
JavaScript 前端开发
杨校老师课堂之JavaScript定时器案例的红绿灯设计--原始写法
杨校老师课堂之JavaScript定时器案例的红绿灯设计--原始写法
57 0
|
8月前
|
搜索推荐 JavaScript 前端开发
《vue3实战》运用push()方法实现电影评价系统的添加功能
《vue3实战》运用push()方法实现电影评价系统的添加功能
《vue3实战》运用push()方法实现电影评价系统的添加功能
|
前端开发
#yyds干货盘点 【React工作记录二十三】如何进行时间戳的大小比较
#yyds干货盘点 【React工作记录二十三】如何进行时间戳的大小比较
106 0
|
前端开发
#yyds干货盘点 【React工作记录十】三元对按钮进行判断操作
#yyds干货盘点 【React工作记录十】三元对按钮进行判断操作
94 0
|
前端开发 JavaScript
带你读书之“红宝书”:第三章 语法基础(中)之 数据类型中部分Number类型③
带你读书之“红宝书”:第三章 语法基础(中)之 数据类型中部分Number类型③
109 0
带你读书之“红宝书”:第三章 语法基础(中)之 数据类型中部分Number类型③
|
前端开发
#yyds干货盘点# 【React工作记录五十七】添加按钮的两种方式
#yyds干货盘点# 【React工作记录五十七】添加按钮的两种方式
199 0
#yyds干货盘点# 【React工作记录五十七】添加按钮的两种方式
|
JavaScript 前端开发 API
js基础-面试官想知道你有多理解call,apply,bind?[不看后悔系列]
函数原型链中的 apply,call 和 bind 方法是 JavaScript 中相当重要的概念,与 this 关键字密切相关,相当一部分人对它们的理解还是比较浅显,所谓js基础扎实,绕不开这些基础常用的API,这次让我们来彻底掌握它们吧! 目录 call,apply,bind的基本介绍 call/apply/bind的核心理念:借用方法 call和apply的应用场景 bind的应用场景 中高级面试题:手写call/apply、bind call,apply,bind的基本介绍 语法: fun.call(thisArg, param1, param2, ...) fun.apply(
203 0
js基础-面试官想知道你有多理解call,apply,bind?[不看后悔系列]
|
前端开发
牛客刷题——前端面试【四】谈一谈async 函数、await表达式
本节学习并了解async 函数、await表达式。
153 0