学C笔记归纳 第四篇——static关键字(重点)

发布时间 2023-12-04 11:32:10作者: 王小龙s

C语言本身内置了关键字,并非自己创建,也不能自己创建。

static的功能:

static功能
修饰局部变量 转变储存位置,延长局部变量生命周期,也可以保持其值不变
修饰全局变量

将外部链接属性变为内部连接属性,使作用域变小,其他源文件(.c)就不能再使用这个全局变量了,增加程序安全性

模块内函数外,将其变成本地全局变量

修饰函数

将外部链接属性变为内部连接属性,使作用域变小

将此函数变为模块的静态函数,模块内其他函数无法调用

 

 

 

 

 

栈区 局部变量...
堆区 动态内存管理
静态区 静态变量、全局变量...

 

 

 

 

 

 

局部变量进入作用域创建,出作用域销毁,static修饰局部变量时,局部变量出作用域也不销毁,本质上static修饰局部变量时,改变了变量的存储位置,程序结束时,静态变量才销毁。

存储位置的改变,影响的是变量的生命周期。

 

#include <stdio.h>

int add()
{
    static int a = 1;//改变变量a的存储区域
    a++;
    printf("%d\n", a);
    return 0;
}

int main()
{
    int i = 0;
    while (i < 5)
    {
        add();
        i++;
    }
    add();
    return 0;
}

 先看不用static修饰:

 

用static修饰变量a:

 进入反汇编界面:

 

可以发现,该静态变量没有对应汇编语句。

那么试试将变量a直接定义为全局变量:

反汇编:

 

同样没有对应汇编语句。

前面已经说过static修饰局部变量时会改变局部变量的存储位置到静态区,全局变量也存储在这个位置,

那么static修饰局部变量是不是就相当于定义全局变量呢? 这个问题还不能下定论,留在此处,标记日后处理。

 

补充一个关键字extern,调用模块内其他文件定义的全局变量时需声明 ,

编译器工作时是扫描本页面代码,如果不声明此变量,编译器就会报错未定义此变量,所以跨文件调用需声明。

注意:跨文件调用函数不声明不会报错,有时会警告,所以最好声明