static类型的变量

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关键字就可以两者兼得了,既定义了全局变量,在多文件程序中又不用担心变量重复,适合封装单独的功能模块;

原文地址:https://www.cnblogs.com/codeAB/p/6524979.html