auto关键字用于声明变量的生存期为自动,auto修饰的是自动类型的变量,对于局部变量默认就是自动类型的变量,如果没有赋初值它的值就是随机值。
static 修饰的变量或者函数有如下特点:
- static修饰的局部变量,可以延长变量的生命周期(不会被多次初始化)
- static修饰的全局变量或者函数只能在本文件中使用(私有privacy)
const(const修饰的全局变量在.ro段存储,const修饰的局部变量在栈区存储。)
被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
extern
extern修饰的变量或者函数没有在当前没有中,而是在其他文件中。
volatile
作用是每次都从内存中获取最新的值,不从缓存中取值。
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器);
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables);
3). 多线程应用中被几个任务共享的变量;
register
register修饰的变量是寄存器类型的变量,如果不加register修饰变量是在内存上存储的。
加了register变量就在寄存器中存储,寄存器类型的变量在运算的时候比内存上的变量运
算的效率更高。在一个处理器上寄存器的个数是有限制的一般40个左右。寄存器类型的变量
不能取地址,因为它没有在内存中存储。
问题:
一个参数既可以是const还可以是volatile吗?解释为什么。
是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
一个指针可以是volatile 吗?解释为什么。
是的。因为指针和普通变量一样,有事也有变化程序的不可控性。常见例:子中断服务子程序修改一个指向一个buffer的指针时,必须用volatile来修饰指针。
标签:const,变量,auto,register,volatile,寄存器,修饰 From: https://blog.csdn.net/weixin_62298792/article/details/140475246