首页 > 其他分享 >C--存储类型和特征修饰

C--存储类型和特征修饰

时间:2023-08-02 21:01:43浏览次数:28  
标签:初始化 存储 变量 -- 编译器 寄存器 修饰

C语言中的存储类型和特征修饰

C语言中的变量定义

C语言变量定义的格式为:

存储类型 特征修饰 数据类型 变量名

存储类型:决定变量的存储位置
特征修饰:决定变量的特征属性
数据类型:决定变量的存储空间和数据范围
变量名:决定变量的引用标识

一般定义变量时,前两者都是省略的,比如

char a = 'a';

存储类型

当省略存储类型时,存储类型默认为autoauto只能修饰局部变量,其存储在栈区,并且生命周期为其所属的函数从开始到结束。存储类型决定了变量在内存中存储的位置与链接性,与此同时也决定了变量的生命周期。下面详细说明四个存储类型关键字。

关键字 存储位置 链接性 生命周期 所修饰变量 补充说明
auto 栈区 本地 所属函数开始到结束 局部变量 定义变量时如果没有显示指定存储类型,那么编译器将默认视之为auto存储类型。
extern DATA段(初始化数据段) 外部 所属程序从开始运行到结束 全局 extern关键字告诉编译器其修饰的变量是引用自外部文件,不需要为其分配内存空间;extern变量不能和static变量同时使用
static 静态区(初始化数据段) 本地 所属程序从开始运行到结束 局部/全局 不能和extern关键字联用;修饰局部变量时,会将修饰的局部变量的生命周期延长,即当函数结束时,该局部变量依然存在
register CPU中的寄存器 本地 所属函数从开始到结束 局部 告诉编译器将其修饰的变量存储在CPU中的寄存器中
未初始化数据段与已初始化数据段

未初始化数据段,又叫.bss段,存放的是未初始化的全局变量和未初始化的静态局部变量;已初始化数据段,又叫.data段,存放的是已经初始化的全局变量和已经初始化的静态局部变量

特征修饰

特征修饰符一共有两个,一个是const,其把修饰的变量访问权限设置为只读。 另一个是volatile

volatile

volatile意为“易变的”,它的作用是告诉编译器不要优化其修饰的变量在内存中的存取。对于CPU而言,它访问内存的速度是慢于访问寄存器变量的速度的,多次访问内存会导致效率下降。因此,对于如何提高CPU效率,有三种做法,硬件上的做法是使用多级缓存,而程序员可以做的则是对代码的优化,然后编译器能做的则是编译器优化。 比如,定义了变量a,b,c,并分别把a赋给b,c
	int a = 1;
	int b,c;
	b = a; //a在内存中的位置->寄存器;
	       //寄存器->b在内存中的位置
	c = a;//a在内存中的位置->寄存器;(这一步可以省略)
	       //寄存器->c在内存中的位置

编译器优化后会将变量a临时在寄存器中备份,避免每次都从内存中取一次a的值,从而提高程序效率。如果将a声明为volatile,那么编译器便不会这样优化,从而不会将a的值备份进寄存器里,因此每次仍然需要在内存中读取a的值。

使用场景

  1. 多线程可能改变变量的值
  2. 外部中断程序可能改变变量的值
  3. 硬件寄存器的值可能随时会改变

标签:初始化,存储,变量,--,编译器,寄存器,修饰
From: https://www.cnblogs.com/starkly/p/17601638.html

相关文章

  • 运算符
    1.算数运算符算数运算符分为:+,-,*,/,%,++,--System.out.println(5/2);//2,因为都是int类型,所以结果也是int类型,因此舍弃小数System.out.println(5/2.0);//2.5,int类型除double类型结果是double类型System.out.println(5%2);//1,商2余1System.out.println((3%7);//3,小的对大的......
  • git pull
    hint:Pullingwithoutspecifyinghowtoreconciledivergentbranchesishint:discouraged.Youcansquelchthismessagebyrunningoneofthefollowinghint:commandssometimebeforeyournextpull:hint: hint:  gitconfigpull.rebasefalse #merge(th......
  • 省选前全部笔记
    观前提醒其实也不能说是笔记,以为你看看就知道了,好多更像是日记。可以试试去调错字,因为你能挑出100个我写错的字(不带夸张)主要是分享一下我当时的精神状态,希望处在低谷的oier们也不要灰心。学术内容可以略看,因为不少是扯淡。大部分英语是chinglish,图一乐就行至于我有没有入选......
  • 8.02日
    起初,我对这种生活方式感到有点无聊和不适应,但是现在我开始逐渐享受这种简单的生活了。早上,我醒来后第一件事就是泡一杯咖啡。我喜欢静静地坐在阳台上,感受清晨的宁静。然后,我会打开电脑,开始处理一些工作上的事情。在家办公虽然有些不方便,但是至少我可以穿着舒适的衣服,不用担心交通......
  • ssrf-bypass
    第一道urlbypass  不太懂,搜攻略攻略说用@,也没解释,咱自己搜搜 大概就是忽略了url=到@前面这段,最后访问的还是127.0.0.1/flag.php下一道,数字ipbypass  都提醒了十进制,试试别的进制 16进制:0x7F.0x00.0x00.0x01 顺便试了192.168.0.1和localhost,192会一......
  • COMSOL中的求解器(1)—— 方程形式
    1.流程COMSOL中将PDE转成ODE(瞬态仿真),再通过对时间项离散,最后获得稀疏矩阵方程,通过求解器求解。而稳态仿真则跳过上述时间离散的过程,其余与瞬态仿真求解一致。流程如下:瞬态: 稳态:   2.隐式ODE,及其离散形式 将隐式方程L(U对时间的导数,U,t)=0 进行离散,获......
  • post时间注入脚本
    importrequestsimportsysimporttimeimportpdbclassInjection():def__init__(self):self.url=""self.schemataNum=0defInjectionSchemaNumber(self):high=30low=1mid=(low+high)//2......
  • 高效Python-2-1 剖析(Profiling 性能分析)
    2从内置功能中获取最高性能本章包括剖析代码以发现速度和内存瓶颈更有效地利用现有的Python数据结构了解Python分配典型数据结构的内存成本使用懒编程技术处理大量数据有很多工具和库可以帮助我们编写更高效的Python。但是,在我们深入研究提高性能的所有外部选项之前,让我......
  • 人大金仓数据库连接异常简单分析查看的方法
    人大金仓数据库连接异常简单分析查看的方法背景这边一个测试环境,人大金仓4000的连接池最近出现多次连接池用光的问题.想着简单分析一下.给研发同事进行问题定位.这里简单记录一下问题流程研发反馈数据库无法连接.我这边之前部署了一套kmonitor直接进行查看.发......
  • 反射机制--python
    引用:https://www.cnblogs.com/vipchenwei/p/6991209.htmlhttps://www.cnblogs.com/vipchenwei/p/6991209.html 1.反射是什么:反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)......