C语言笔记 第九课 const和volatile分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_42187898/article/details/84871927

第九课 const和volatile分析

const只读变量

const修饰的变量是只读的,本质还是变量
const修饰的局部变量在栈上分配空间
const修饰的全局变量在全局数据区分配空间
const只在编译期有用,在运行期无用
const修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边。

const全局变量的分歧

在现代C语言编译器中,修改const全局变量将导致程序崩溃
注意:
标准C语言编译器不会将const修改的全局变量存储于只读存储区中,而是存储于可修改的全局数据区,其值依然可以改变。
9-1 const的变量本质

const的本质

C语言中的const使得变量具有只读属性
现代C编译器中的const将具有全局生命周期的变量存储于只读存储区
const不能定义真正意义上的常量
9-2 const的本质分析

const修饰函数参数和返回值

const修饰函数参数表示在函数体内不希望改变参数的值
const修饰函数返回值表示返回值不可改变,多用于返回指针的情形

小贴士:

C语言中的字符串字面量存储于存储区中,在程序中需要使用const char*指针。
在这里插入图片描述
9-3const修饰函数参数和返回值

深藏不露的volatile

volatile可理解为“编译器警告指示字”
volatile告诉编译器必须每次去内存中取变量值
volatile主要修饰可能被多个线程访问的变量
volatile也可以修饰可能被未知因数更改的变量
在这里插入图片描述

有趣的问题

const volatile int i = 0;
变量i具有什么样的特性?
编译器如何处理这个变量?
变量i 的类型是int,全局只读并且不被优化,被volatile修饰,程序中出现i的时候,编译器每次都会到内存取值,不被优化,被const修饰,不能出现在赋值符号的左边。
小结:
const使得变量具有只读属性
const不能定义真正意义上的常量
const将具有全局生命期的变量存储于只读存储区
volatile强制编译器减少优化,必须每次从内存中取值
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42187898/article/details/84871927