static作用:
修饰局部变量,改变局部变量生命周期。(具有记忆功能)
下面我们看个例子:
(1)变量不加 static 修饰
运行结果如下:
(2)变量被 static 修饰
运行结果如下:
总结:
- 不加static修饰,函数或者代码块中的变量在函数或者代码块执行完毕后就直接回收销毁了,每次执行都会重新分配内存,每次都会销毁。
- 加 static 修饰,函数或者代码块中的变量在函数或者代码块执行第一次初始化分配内存后,就算函数或者代码块执行完毕,该变量也不会被回收销毁,直到程序结束 static 变量才会被回收。
- 当 static 作用于代码块
{ }
内部定义的变量(局部变量)声明时,static关键字用于修改变量的存储类型(生命期),使变量从自动变量成为静态的局部变量,即编译时就为变量分配内存,直到程序退出才释放存储单元。这样,使得该局部变量有记忆功能,可以记忆上次的数据。 - 当 static 作用于函数定义,或者用于代码块
{ }
之外的变量(外部变量)声明时,static关键字用于修改标识符的链接属性。外部链接属性变为内部链接属性,标识符的存储类型和作用域不受影响。也就是说变量或者函数只能在当前源文件中访问,不能在其他源文件中访问。
extern作用
仅仅是用来声明外部全局变量(注:extern不能用来定义变量)。
为了起到全局变量的作用,即一个变量在一个文件中定义了,可以在其他文件中修改。这样可以在.h头文件中,使用extern修饰,然后在其他文件中使用该变量。
int a; ——> 这是声明变量a
int a = 0; ——>这是定义一个变量a
extern int x; //变量是声明,并未实际分配地址。
const作用
const 修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。或者说const意味着只读。这样可以保护被修改的东西,防止意外的修改,增强程序的健壮性。
volatile作用
volatile 关键字是一种类型修饰符。volatile 的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。直接读值是指从内存重新装载内容,而不是直接从寄存器拷贝内容。
volatile应用比较多的场合,在中断服务程序和cpu相关寄存器的定义。
参看:C语言再学习 – 关键字volatile
参考: