关键字const、static、extern、register、volatile、auto的作用
一、const
- const修饰一般变量时(以整型变量为例):表示定义一个只读变量,即为常变量(定义常变量时要初始化,没有初始化则为随机值)。
const int a = 10; - const修饰指针变量时:
(1) 常量指针,指针指向的值不可以改变,指针的指向可以改变。
const int *p;
int const *p;
(2)指针常量,指针指向的值可以改变,指针的指向不可以改变。
int * const p;
(3)常量指针常量,指针指向的值和指针的指向都不可以改变。
const int * const p; - const常用在修饰函数的参数,可以防止传过去的值被不小心修改。
总结:
const的作用是防止参数被修改,可以理解为“只读”属性
二、static
- static修饰局部变量时:
(1)改变了其存储位置,存储在静态区;
(2)改变了其生命周期,为整个源程序,因此它只被初始化一次,若没初始化则自动初始化为0。 - static修饰全局变量时:改变了其作用域,只可以被本文件内的函数访问。
- static修饰函数时:改变了其作用域,只可被这本文件内的其它函数调用。
总结:
延长局部变量的生命周期。
限制全局变量和函数的作用域。
三、extern
- 作用:用于跨文件引用全局变量和函数,即在本文件中引用一个已经在其他文件中定义的全局变量和函数(函数一般不常用)。
- 注意:
(1)引用时不能初始化,如extern int var,而不能是extern int var = 0。
(2)函数默认是extern类型的(具有外链属性),表明是整个工程文件可见的。
四、register
- 作用:编译器会将register修饰的变量尽可能地放在CPU的寄存器中,以加快其存取速度,一般用于频繁使用的变量。
- 注意:
(1)register变量可能不存放在内存中,所以不能用&来获取该变量的地址。
(2)只有局部变量和形参可以作为register变量。
(3)寄存器数量有限,不能定义过多register变量。
五、volatile
-
作用:防止编译器优化,要求每次读取数据,必须在内存上取,而不是使用保存在寄存器或者cache里的备份。
-
例子:
(1)并行设备的硬件寄存器(如:状态寄存器)。
(2)一个中断服务子程序中会访问到的非自动变量。
(3)多线程应用中被几个线程共享的变量(防止死锁)。详细解读: link
六、auto
声明的变量是一个自动类型的变量。
局部变量不写存储类型默认的就是 auto。
非自动类型的变量:
1.全局变量
2.static修饰的局部变量