C语言之static

静态变量与静态函数

静态变量

静态关键字

静态类型关键字是static
形式:static type X = 0;

C语言代码是以文件为单位来组织的,在一个源程序所有源文件中,外部变量或函数都只能在某个文件中定义一次,而其它文件要访问需要用extern(全局的)声明,当然定义外部变量或函数的源文件中也可以用extern声明该外部变量。

static(静态的)可以限定变量或函数为静态存储,全局变量本身就是静态存储方式,这两者在存储方式上并无不同,只是作用域和生命周期不一样。

几中变量的异同

变量名 作用域 生命周期 无显示初始化默认初始值
动态全局变量 整个程序 程序开始至结束 0
静态全局变量 整个源文件 源程序开始至结束 0
动态局部变量 定义的函数体内{} 函数开始至函数结束 随机值
静态局部变量 定义的函数体内{} 程序开始至结束 0

注意⚠️:

  1. 全局变量和静态全局变量都是静态储存,在储存上没有区别。
  2. 全局变量可以作用多个源程序,当源程序由多个源文件组成时,全局变量在多个源文件中都有效。
  3. 静态全局变量只在定义了该变量的源文件中有效,其他源文件不能使用。
  4. 静态局部变量当出了某个函数时,变量的值还存在,当函数下一次再调用时,静态变量不会再次初始化,而是沿用上次函数退出的值。
  5. static修饰栈变量,栈变量已经不再存储在栈中,而是和全局变量一起存储。栈变量的生命周期由OS管理,在退栈的过程中,栈变量的生命也就结束了。加入static修饰之后,栈变量的生命周期延长到程序执行结束时。

例子

累加的算法

int Add(int x)
{
    static int sum = 1;
    sum += x;
    return sum;
}

int main()
{
    for (int i = 0; i < 5; i++)
    {
        printf("%d\n", Add(i));
    }
    system("pause");
    return 0;
}

输出结果: 1 2 4 7 11

如果去掉static

int Add(int x)
{
    int sum = 1;
    sum += x;
    return sum;
}

int main()
{
    for (int i = 0; i < 5; i++)
    {
        printf("%d\n", Add(i));
    }
    system("pause");
    return 0;
}

输出结果: 1 2 3 4 5

静态函数

形式:static type fun(); 静态函数

形式:extern type fun1(); 普通函数

通常情况下,(返回值类型)类型前面不写关键字默认为extern。

静态函数的特点:

  1. 其他文件中可以定义相同的名字的函数。
  2. 静态函数被自动分配在一个一直使用的存储区,直到退出运用实例,避免了函数调用时压栈出栈,速度快了很多。
  3. static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝,节省单次调用函数时的空间。

猜你喜欢

转载自blog.csdn.net/wsq119/article/details/80628126