C语言中的存储类型和特征修饰
C语言中的变量定义
C语言变量定义的格式为:存储类型 特征修饰 数据类型 变量名
存储类型:决定变量的存储位置
特征修饰:决定变量的特征属性
数据类型:决定变量的存储空间和数据范围
变量名:决定变量的引用标识
一般定义变量时,前两者都是省略的,比如
char a = 'a';
存储类型
当省略存储类型时,存储类型默认为auto,auto只能修饰局部变量,其存储在栈区,并且生命周期为其所属的函数从开始到结束。存储类型决定了变量在内存中存储的位置与链接性,与此同时也决定了变量的生命周期。下面详细说明四个存储类型关键字。
关键字 | 存储位置 | 链接性 | 生命周期 | 所修饰变量 | 补充说明 |
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的值。
使用场景
- 多线程可能改变变量的值
- 外部中断程序可能改变变量的值
- 硬件寄存器的值可能随时会改变