1. register
作用:请求编译器尽可能的将变量保存在CPU内部寄存器中。
用法:用于经常被访问的变量,可以节省CPU访问变量的时间。eg. 循环变量
注意事项:
a. register只能修饰局部变量,不能修饰全局变量。因为一旦用register修饰,其它进程就不知道它的位置。
b.不能用取地址符&去获取register修饰的变量。因为变量不一定保存在寄存器中,资源是有限的。
c.register修饰的变量类型一定是CPU接收的数据类型。
2. static
作用:起到延长生命周期和保护的作用。
用法:
a. static修饰局部变量,延长变量的生命周期,在程序结束后释放。
b. static修饰全局变量,保护变量,只能在本文件可见,在其它文件不可见。
c. static修饰函数,保护函数,只能在本文件调用,不能在其它文件调用。
注意事项:
a. static修饰的变量保存在静态数据区,默认初始化值为0。
b. 尽可能的要少使用全局变量。因为全局变量对所有可见,容易被修改。
3. const
作用:可以保护所修饰的变量的值不被“修改”。
用法:const + 变量 (离谁近,谁就不能被修改)
注意事项:
a. const修饰变量,要先进行初始化。eg. const int a = 5;
b. const修饰变量,不能通过变量名来修改,但是可以通过地址来修改值。
#include <stdio.h>
int main()
{
const int a = 5;
printf("a = %d\n", a);
int *p = &a;
*p = 6;
printf("a2 = %d\n", a);
return 0;
}
[root@localhost 0725]# ./a.out
a = 5
a2 = 6
4. typedef
作用:对已有的类型声明一个新名字。
用法:可以提供代码的移植性,方便定义变量以及解释作用。
5. extern
作用:表示变量或者函数的定义在别的文件中。
用法:在一个c文件中访问另一个c文件中的变量。
注意事项:extern仅仅是一个变量的声明,其并不是在定义变量,并未为变量分配实际的内存空间。
6. volatile
作用:用来修饰被不同线程访问和修改的变量,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
用法:
a.中断服务程序中修改的供其它程序检测的变量要加volatile。
b.多任务环境下各任务间共享的标志要加volatile。
c.存储器映射的硬件寄存器通常要加volatile。