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