千家信息网

C语言的const和volatile怎么使用

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容主要讲解"C语言的const和volatile怎么使用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C语言的const和volatile怎么使用"
千家信息网最后更新 2026年11月01日C语言的const和volatile怎么使用

本篇内容主要讲解"C语言的const和volatile怎么使用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C语言的const和volatile怎么使用"吧!

一、const的用法:

1、const只读变量:

  • const修饰的变量是只读的,本质上还是变量

  • const修饰的局部变量在栈上分配空间

  • const修饰的全局变量在全局数据区分配空间

  • const只在编译期有用,在运行期没有用

注:const修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边

2、const全局变量的分歧:

  • 在现代c语言编译器中,修改const全局变量将导致程序崩溃

  • 标准c语言编译器不会将const修饰的全局变量存储于只读存储区中,而是存储于可修改的全局数据区,其值依然可以改变

3、代码示例:

(1)只读变量代码示例:

#include 

int main()
{
const int a =10;
printf("a = %d\n",a);

a=20;
printf("a = %d\n",a);

return 0;
}

运行结果:

test.c: In function 'main':
test.c:8:4: error: assignment of read-only variable 'a'
a=20;
^

注解:显示这个结果很正常,变量a被const修饰了,它就成了只读的。

(2)如果对变量a的值进行修改:

#include 

int main()
{
const int a =10;
int *p =(int *) &a;
printf("a = %d\n",a);

*p=20;
printf("a = %d\n",a);


return 0;
}


运行结果:

root@txp-virtual-machine:/home/txp# ./a.out
a = 10
a = 20

注解:通过指针的方式,就能够把a的值进行修改,这也论证了"const修饰的变量是只读的,本质上还是变量"这句话

(3)const修饰全局变量:

代码版本一

#include 
const int b = 40;

int main()
{


printf("b = %d\n",b);
b=20;
printf("b = %d\n",b);


return 0;
}

输出结果:

root@txp-virtual-machine:/home/txp# gcc test.c
test.c: In function 'main':
test.c:10:4: error: assignment of read-only variable 'b'
b=20;
^

注解:跟const修饰栈上的变量用法一样

代码版本二

#include 
const int b = 40;

int main()
{

int *p =(int *) &b;
printf("b = %d\n",b);

*p=20;
printf("b = %d\n",b);


return 0;
}

运行结果:

root@txp-virtual-machine:/home/txp# ./a.out
b = 40
Segmentation fault (core dumped)

注解:这里出现了段错误,这也验证了我们上面所说的"修改const全局变量将导致程序崩溃"。

同时为了验证"标准c语言编译器不会将const修饰的全局变量存储于只读存储区中,而是存储于可修改的全局数据区,其值依然可以改变"这句话,我把这段代码放到dev c++上进行试验:

说明:我这个版本的编译器支持标准c语言,所以没导致程序崩溃,能够正常运行

4、const的本质

  • c语言中的const使得变量具有只读属性

  • 现代c编译器中的const将具有全局生命周期的变量存储于只读存储区,不是放在全局数据区

注:const不能定义真正意义上的常量;同时这里注意static关键字修饰的变量,它的生命周期和全局变量一样。

代码示例:

#include 

const int Array[5] = {0};

void fun(int *p,int v)
{
*p=v;
}
int main()
{
int const i =1;
const static int j =2;
int const array[5] = {0};

fun((int *)&i,1);
fun((int *)&j,2);
fun((int *)&array[2],3);
fun((int *)&Array[1],4);

return 0;

}

输出结果:

root@txp-virtual-machine:/home/txp# ./a.out
Segmentation fault (core dumped)

注解:这里会有段错误,错误出现在const+static修饰的j变量对其进行修改,还有const修饰的全局数组。

5、const修饰函数参数和返回值

  • const修饰函数参数表示在函数体内不希望改变参数的值

  • const修饰函数返回值表示返回值不可改变,多用于返回指针的情形

在c语言中的字符串字面量存储于只读存储区中,在程序中需要使用const char* 指针,例如:

const char * s = "TXP嵌入式";//字符串字面量

代码示例:

#include 

const char*fun(const int i)
{
i=8;
return "TXP";
}
int main()
{
const char * p=fun(0);
printf("%s\n",p);
p[1]='_';
printf("%s\n",p);

return 0;


}


输出结果:

root@txp-virtual-machine:/home/txp# gcc test.c
test.c: In function 'fun':
test.c:5:4: error: assignment of read-only parameter 'i'
i=8;
^
test.c: In function 'main':
test.c:12:5: error: assignment of read-only location '*(p + 1u)'
p[1]='_';
^

注解:上面这样写,肯定有问题。

代码进化:

#include 

const char*fun(const int i)
{
// i=8;
return "TXP";
}
int main()
{
const char * p=fun(0);
printf("%s\n",p);
// p[1]='_';
// printf("%s\n",p);

return 0;


}

输出结果:

root@txp-virtual-machine:/home/txp# ./a.out
TXP

二、volatile的用法

老实说,这个关键字在面试题目里面经常会出现,但是平时学习的时候,如果你没有真正理解这其中的含义,在笔试的时候,脑袋里面可能依稀是记得有那么几个结论,但是有时候吧,一紧张就把结论给忘了,也不是不可能,所以说,咋们还是老实一点,得真正把它原理搞明白才行,这样上来战场就不怕了,以后写代码也就少一点bug。

1、volatile的常用结论(volatile英文本意就是易变的意思)

这里我先给结论,然后再给一个例子,把这个例子的讲明白,所有结论就都明白了。

  • volatile可理解为"编译器警告指示字"

  • volatile告诉编译器必须每次去内存中取变量值

  • volatile主要修饰可能被多个线程访问的变量

  • volatile也可以修饰可能被未知因素更改的变量

  • volatile可以修饰一个中断子程序中会访问到的非自动变量

2、分析原理

大家可能平时在博客学习,都会发现讲解编译器优化的,然后加了volatile关键来修饰变量,就告诉编译器不要去优化这个变量了,那么这里的优化到底是什么意思呢?

从字面上来理解优化两个字,意思就是最优值(变量的值不会改变),这里我用一个简单代码来说明一下:

#include 

int main()
{
int a =1;//volatile int a =0;

while(a)
{

}
}

说明:上面的代码,如果变量a没有加volatile修饰的话,编译器就会优化它(也就是a的值一直不变),所以while就一直死循环;然后我如果加了volatile来修饰的话,编译器就不会去优化变量a,不优化的意思就是说,变量a的值可能就会改变,while就不会一直死循环。

当然这里为了好理解,我说的不是很专业,没有从寄存器和内存的角度去说。(我也不想那么去讲解,简单理解了就行)

到此,相信大家对"C语言的const和volatile怎么使用"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

变量 全局 编译 编译器 代码 存储 语言 结果 注解 结论 函数 意思 数据 示例 程序 学习 输出 运行 关键 参数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 伟宏互联网科技 山东特亿宝互联网科技有限公司 云信互联网科技有限公司 中关村互联网科技集团 融势互联网科技 丰台科技园 互联网公司 哈尔滨新华互联网科技 卫星互联网科技股票 互联网汽车科技小镇 中国的互联网科技企业的崛起 崇明区互联网教育科技售后服务 杭州壁岐互联网科技有限公司 山东星卡互联网科技有限公司官网 互联网科技快讯热点 互联网科技融合创新 35岁以上互联网科技行业 2021世界互联网领先科技成果发布 现代互联网科技公司 平安好医生打造互联网科技医疗 科技互联网专业务虚会材料 新华互联网科技 互联网前沿科技 恒生科技互联网指数分析 深圳前海聚择互联网科技有限公司 天速互联网络科技有限公司 常德市电业局互联网科技部 厦门千工互联网科技有限公司 深圳市罗太互联网科技有限公司 神州科技互联网有限公司 同城互联网络科技
0