Const(恒定不变的)
被Const关键字修饰的变量、数组、指针、函数返回值,在编译时告诉编译器这是一个只读变量,且在定义时不会分配内存空间给变量,此时编译器无法得知它的值,只有在运行过程中它是一个全局的只读变量,被存放在静态区。
Const与宏define有点相似,都不具有可变性(不能在使用过程中修改它的值),都需要在定义同时初始化。但define是只做简单的替换,相当于是一个符号而非变量,而const修饰的仍然是一个变量。
例如:
#define min 100
cons tint max =100;
int Array[min];
int Array[max];// —— C语言中非法,编译时max是一个非确定的值
const修饰一般(只读)变量、(只读)数组时 int const I = 2; ó const int I = 2;
const修饰指针时:
const int *p; ó int const*p;表示p指向可以变,但p指向的对象不可变
int *const p; 表示p指向不可以变,但p指向的对象可变
const int*const p;表示都不可以变
将const用于修饰函数的参数,可以防止该参数的值在函数内部被修改。
void fun(cons tint i);
将const用于修饰函数返回值,表明该返回值在调用函数中不能被修改。
const int fun(void);
能在一定程度上节省内存空间分配。
Static(静态变量声明)
static修饰的变量为静态变量,被static修饰的变量无论全局还是局部变量都被存在内存静态区。
静态全局变量,一般将其定义在文件的顶端,它的作用域是从它被定义的位置开始到该文件的结尾处,无法在其它文件里或被定义的位置之前使用。
静态局部变量,被定义在函数里面的静态变量,只有在第一次被调用时初始化一次,之后该变量的值不会跟随函数被释放,而是会一直保存在静态存储区,函数下一次被调用时,该变量的值保持不变。在函数外面,这个变量无法被调用。
static修饰的函数为静态函数,与被static修饰的全局变量类似,被static修饰的函数,无法在该文件之外的地方被调用。
Volatile(易变的,不稳定的)
volatile关键字用于告诉编译器,它所修饰的是一个值随时可能会被改变的变量,例如多线程中,操作系统中。遇到这个关键字时,编译器会放弃对它进行优化,每一次调用这个变量都会重新到内存中读取一次它的值。
例如:
int i = 10;
int j = i;
int k = i;
在编译时,编译器会对上述三条语句进行优化,执行第二条语句时,会从内存中读取一次i的值给j赋值,但在第三条语句时,不会再去内存中读取i的值,而是直接将刚刚所拿到的值再赋值给k。
这在平常使用中不会出现什么问题,但是在多线程以及操作系统中运行时,会出现问题,即在执行第二条语句时,i的值可能在别的线程中或别的位置被改变。导致执行第三条语句所得到的值不符合预期。这时候加一个volatile关键字修饰就能解决问题。
volatile int i =10;
extern(外面的,外来的)
extern是一个声明性修饰符,用于在本文件中声明某个外部文件已经被定义了的变量、函数,通常在跨文件调用变量或函数时用到。
需要注意的是,在本文件中声明时,不能再次初始化该变量。
Sizeof
sizeof是一个可以计算变量所占用内存大小的关键字,不是一个函数,虽然它后面可以带括号(有时也可以省略)。
需要注意的是,sizeof (int);合法,但是sizeof int;是非法的,非法修饰int。
本文是在阅读陈正冲老师所编著《C语言深度剖析》一书所总结的内容,加了一些我自己的理解,更深层次的内容推荐阅读陈老师的原作。