c语言中变量的储存类型有以下四种
auto 如果没有定义储存类型 默认就是这个类型 比如 int a = 10; 储存类型就是 auto;编译器会跟你定义的位置,以及用途,自动帮你决定使用那种储存类别;
如果你定义在函数内 ,那么编译器就把他当做局部变量,如果定义在函数外部,编译器把他归为全局变量,如果这个变量用作 循环因子(for循环中 i );编译器就把他
定义为寄存器变量;
register 寄存器变量,用作循环因子等使用频率极高的变量
extren 全局变量 *从定义的位置开始* 在整个程序执行期间有效,如果这个程序是多文件的,那么在其他文件中也可以使用这个变量;
无论是局部变量还是全局变量,一般都不显示的指明,有编译器来自动区分就好了;
【局部变量 和全局变量的区别】:
全局变量:(生命周期)在程序执行期间有效,(作用域)从定义起本文件和其他文件都可以引用
局部变量:(生命周期)函数执行完就从内存中销毁,(作用域)在函数内有效
static 静态变量 ,可以修饰局部变量和全局变量 ; 上面通过作用域和生命周期对比了局部变量和全局变量,那么加上static关键字修饰后有什么变化呢?
[static 全局变量]:(生命周期)在程序执行期间有效,(作用域)作用域缩小了,只有本文件可以引用,其他文件不能引用了
[static 局部变量]:(生命周期)生命周期变了,在整个程序期间有效,(作用域)还是在函数内有效
看个例子:
#include <stdio.h> void test() { static int t = 3; printf("%d ",t++); } int main(void) { test(); // 3 test(); // 4 test(); // 5 }
如果 去掉static修饰 那么test函数每次打印的都是 3;
值得注意的是,虽然加了static修饰后,t的生命周期变长了(不会因为test执行完就销毁),但是t的作用域还是没有变的,尝试在 main函数里面打印t的值报错;
这个例子其实可以用全局变量t来实现,效果是一样的,那么为什么还需要static关键字呢?
有两个 因素:
(1) 全局变量存放在内存中,而局部变量存放在寄存器中,运行速度相差很大; (这一点不是主要的因素)
(1) 全局变量如果没有加 static的话,在多文件程序里面 多个文件可以读取到这个变量,容易造成变量重名,但是有些时候 有的变量需要在整个文件中都有效又必须要全局变量才能行,
那么加上static关键字就可以两者兼得了,既定义了全局变量,在多文件程序中又不用担心变量重复,适合封装单独的功能模块;