register:
static:
作用:static即可以修饰变量,也可以修饰函数。修饰的变量包括全局变量和局部变量。static在修饰局部变量时,延长了局部变量的生命周期,直至程序执行结束后释放。static修饰全局变量时,只能在其所在的文件可见,其他文件不可见。static修饰的变量存放在数据段的静态数据区(data区),如果没有初始化,系统会默认舒适化为0。static修饰函数的作用与修饰全局变量大同小异,static修饰的函数只能在本文件调用,其他文件不可调用。
extern:
extern是一个外部声明,其修饰的变量以及函数是在其他文件中定义的,在这里声明使用它,这样多个原文件共享变量和函数。
const:
作用:const修饰一个变量,该变量是只读变量,不能通过变量名去修改对应空间的值。const修饰函数形参时,可以避免在函数的实现过程中修改函数的值,便于调试。
const离谁近,谁就不能修改;使用时,要对变量初始化。例:
const int a = 10;
int const a = 10;
const int *p;
const int a[10] = {1,2,3,4,5,6,7,8,9,10};
上述例子把数据类型去掉,然后看const修饰谁,发现分别修饰a,a,*p,a[10],说明这些变量的值不变。
typedef:
作用:
1.给数据类型重起名字,提高代码的移植性。
2.方便在编程中定义变量,提高编写效率。
3.解释某些变量的意思,起注释作用。
typedef与#define的区别:
1.执行时间不同:
关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能;#define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何语法检查。
2.功能不一样:
typedef用来定义类型的别名,定义与平台无关的数据类型,与struct的结合使用等;#define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。
3.作用域不一样:
#define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。而typedef有自己的作用域。
volatile:
volatile是被设计用来修饰被不同线程访问和修改的变量。如果不加入volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。
volatile的作用是: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。简单地说就是防止编译器对代码进行优化.