C语言之const和volatile究极学习
关于const的用法,现在大概前前后后应该写了有两篇文章,以前学习的时候,用法体会不是那么深刻,为啥这么说呢,因为在学习c++的时候,会发现const关键字有新的玩法,关于这个新的玩法,大家可以去看最近学习总结写的c++文章专辑。
一、const的用法:
1、const只读变量:
const修饰的变量是只读的,本质上还是变量
const修饰的局部变量在栈上分配空间
const修饰的全局变量在全局数据区分配空间
const只在编译期有用,在运行期没有用
注:const修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边
2、const全局变量的分歧:
在现代c语言编译器中,修改const全局变量将导致程序崩溃
标准c语言编译器不会将const修饰的全局变量存储于只读存储区中,而是存储于可修改的全局数据区,其值依然可以改变
3、代码示例:
(1)只读变量代码示例:
#include <stdio.h>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 <stdio.h>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 <stdio.h>
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 <stdio.h>
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 <stdio.h>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 <stdio.h>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 <stdio.h>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 <stdio.h>int main()
{int a =1;//volatile int a =0;while(a){}
}
说明:上面的代码,如果变量a没有加volatile修饰的话,编译器就会优化它(也就是a的值一直不变),所以while就一直死循环;然后我如果加了volatile来修饰的话,编译器就不会去优化变量a,不优化的意思就是说,变量a的值可能就会改变,while就不会一直死循环。
当然这里为了好理解,我说的不是很专业,没有从寄存器和内存的角度去说。(我也不想那么去讲解,简单理解了就行)
总之一句话:上面的结论中,volatile修饰的都是变量,变量就可能改变,不会被编译器优化;只是说我们上面的结论应用场景不同而已。
三、总结
const使得变量具有只读属性
const不能定义真正意义上的常量
const将具有全局生命周期的变量存储于只读存储区
volatile强制编译器减少优化,必须每次从内存中取值
好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。我是txp,下期见!
C语言之const和volatile究极学习相关推荐
- UE4·究极·学习记录
UE4官方文档 2020/2/20 周末需要整理一下,遗留的困惑点比较多,也可能在后续的学习中能够反映过来,之前的问题是可以解决的 目前的计划:先学完官方文档,再回头去解答这些疑问 实现相机的切换,相 ...
- C语言小项目之“究极无敌螺旋丸极爆炸狂拽炫酷五彩棒的”通讯录之*派小猩*作品
C语言小项目之"究极无敌螺旋丸极爆炸狂拽炫酷五彩棒的"通讯录之派小猩作品 项目概述 基于C语言开发一个多功能的通讯录 功能目录 1.增加 2.删除 3.查找 4.修改 5.显示 6 ...
- c语言static. volatile,嵌入式系统C语言重点语法const、volatile、static、堆栈等的意义及用法...
原标题:嵌入式系统C语言重点语法const.volatile.static.堆栈等的意义及用法 在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场. 要点:堆, ...
- C语言 const、volatile、const volatile限定符理解
在C语言经常会用到变量类型限定符const和volatile,但是const和 volatile也可以一起使用.下面就一次分析一下这三种情况的使用方法. 1.const 从字面意思理解,意思就 ...
- C语言个人思考# volatile有什么作用?一个参数可以同时用const和volatile进行修饰吗?
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.volatile的作用? 二.volatile,const可否同时修饰一个参数? 总结 前言 提示:这里可以添加本 ...
- c语言restrict和const,C语言中const、volatile、restrict等类型限定符的区别
auto.register.static.extern是属于存储类修饰符.在声明时,存储类修饰符最多只能使用一个,而且无法用在typeof声明中. 而类型限定符是指const.volatile.res ...
- c语言精灵宝可梦对战游戏,精灵宝可梦究极日月模拟器金手指代码大全
<精灵宝可梦究极日月>终于迎来了它的发售,相信许多玩家对于这款游戏的素质还是不用怀疑的吧.不过由于游戏的内容实在是太过丰富,许多玩家表示在游戏中许多要素都没法体验尽兴,以下就给大家分享具体 ...
- LaTeX半小时速成究极进化版(修改版)
唔~~~今年期末考得还凑合~~~今年寒假过得也还凑合(某只昂昂昂,你知道我zhai说你~~~)~~~又看到有人在转一些关于LaTeX的东东,觉得网上给的模板要不只适用于英文论文(维基百科上面对于一些数 ...
- static、const、volatile等关键字作用
目录 一.需要明白c语言中对象的一些属性 1.C语言中内存分配 2.变量的作用域 3.链接属性 4.存储期 二.static.const.volatile关键字作用 1.static关键字作用 2.c ...
最新文章
- const常对象成员与常成员函数
- 2017可信区块链峰会在京举办 可信区块链标准和测评结果公布
- MySQL like 通配符是_MySql模糊查询like通配符使用详细介绍
- lua split实现(lua程序设计10.6练习10.1题)
- window的war发布Linux失败,为什么war包在Windows的tomcat正常运行,在linux服务器报errorpage错误?...
- 温故js系列(4)-运算符详解
- python定义字典对象时_Python对象类型之字典
- 优化算法之遗传算法(Genetic Algorithm, GA)
- Python爬虫(三)--百度贴吧
- 【2019南京icpc网络赛 I】Washing clothes【李超树】
- 解码2022中国网安强星丨构建企业第一重“安全感”,联软科技以零信任重塑网络安全边界
- ryuyan 方差分析_R语言之方差分析篇
- 计算机中丢失jadec.dll,技能干货丨超实用,Jade各种安装问题完美解决方案!
- 用户兴趣模型分类以及推荐系统技术调研
- mysql存储视频_特殊格式文件(视频、声音等) 在数据库中的存储方式
- python如何对excel批量加密_用python加密excel工作表
- 江苏计算机二级报名一年几次,江苏计算机二级每年考几次
- OpenCPU入门基础
- 双目是个词吗_描写眼睛的词语3个字
- 成为zabbix合作伙伴费用及意义
热门文章
- java下载网站图片代码_java下载网上的图片到本地
- 实现全球同服,保障业务出海——腾讯云跨域加速解决方案
- Uber数据泄露事件本可以使用区块链…
- @ResponseBody 406:The resource identified by this request is only capable of generating respon......
- APP上架到各大应用商店指南
- getopt Python
- 装逼神器,5 行 Python 代码 实现一键批量扣图
- python 读取zip包中的数据
- 【实时语音转文本】PC端实时语音转文本(麦克风外音系统内部音源)
- flutter 语音转文字(科大讯飞)