【C语言】全局变量、静态本地变量

在C语言中,变量是存储数据的基本单元。

不同类型的变量有着不同的特性和用途,其中全局变量和本地变量是比较特殊且重要的两类变量。

一、全部变量

1.1 全局变量的作用域和生存期

全局变量是在函数外部定义的变量,其作用域从定义的位置开始,直到源文件的末尾。

这就意味着,除了同名局部变量覆盖的区域外(也就是在函数内部同样变量名的变量所在的范围),所有函数都可以访问这个全局变量。

全局变量的生存周期从程序开始时创建,直到函数结束时才销毁,如:

  • 引入头文件
cpp 复制代码
#include <stdio.h>
  • 定义全局变量
cpp 复制代码
int g_var = 10; 
  • 在函数中
cpp 复制代码
void function() {
    printf("在函数中访问全局变量: %d\n", g_var);
}
  • 在主函数中
cpp 复制代码
int main() {
    function();
    printf("在主函数中访问全局变量: %d\n", g_var);
    return 0;
}

⬇️

图解

1.2 全局变量的访问和使用

访问变量时,直接使用变量名即可。

在函数中修改全局变量的值,会影响到其他函数对该变量的访问。

不过,我并不推荐过多的使用全局变量,因为这样会导致代码的可读性和可维护性降低,因为变量的值可能在不同的函数中被修改,难以追踪其变化。

  • 引用头文件
cpp 复制代码
#include <stdio.h>
  • 定义全局变量
cpp 复制代码
int g_var = 0;
  • 对全局变量进行加法
cpp 复制代码
void jiaf() {
    g_var ++;
}
  • 主函数
cpp 复制代码
int main() {
    jiaf();
    printf("g_var = %d\n", g_var);
    return 0;
}

⬇️

1.3 全局变量的初始化和默认值

全局变量在定义时可以进行初始化。

如果没有显式初始化,全局变化会被自动初始化为0(对于数值类型)或空指针(对于指针类型)。

  • 引用头文件
cpp 复制代码
#include <stdio.h>
  • 定义全局变量
cpp 复制代码
int g_num; 
int g_arr[5]; 
  • 主函数(遍历全局变量并输出)
cpp 复制代码
int main() {
    printf("未初始化全局变量 g_num: %d\n", g_num);
    for (int i = 0; i < 5; i++) {
        printf("未初始化全局数组元素 g_arr[%d]: %d\n", i, g_arr[i]);
    }
    return 0;
}

⬇️

用表格来表示就是:

变量声明 是否初始化 默认值
int g_num; 0
int g_arr[5]; 数组元素均为 0

1.4 全局变量的隐藏和作用域

当局部变量和全局变量同名时,局部变量会隐藏全局变量。

在局部变量的作用域内,访问的是局部变量,而不是全部变量。

如果要在局部作用域访问被隐藏的全部变量,可以使用::作用域解析运算符(c++),但在C语言中没有这样的运算符,只能通过一些间接的方式来访问全局变量。

  • 引用头文件
cpp 复制代码
#include <stdio.h>
  • 定义全局变量
cpp 复制代码
int num = 10; 
  • 局部变量隐藏全局变量
cpp 复制代码
void function() {
    int num = 20; 
    printf("局部变量 num: %d\n", num);
}
  • 全局变量
cpp 复制代码
int main() {
    function();
    printf("全局变量 num: %d\n", num);
    return 0;
}

⬇️

图解

二、静态本地变量

2.1 静态本地变量的特性

静态本地变量实在函数内部使用static关键字声明的变量。

它的特性包括:只在第一次调用函数时进行初始化,之后调用函数时候不会再次初始化;变量的值在函数调用之间保持不变。

2.2 静态本地变量的执行过程

当程序首次调用包含静态本地变量的函数时,系统会在静态存储区为该变量分配内存。

要是变量在声明时有初始化值,那么就会执行初始化操作;要是没有显式初始化,数值类型的静态本地变量会被自动初始化为0,指针类型则会被初始化为空指针。

函数执行期间,静态本地变量能够参与各类运算,其值会依据函数内的操作而改变。当函数执行完毕返回时,静态本地变量所占用的内存空间不会释放,它的值会保存在内存中。之后再次调用这个函数时,不会对静态本地变量重新初始化,而是直接使用上次函数调用结束时该变量保存的值。

·引用头文件

cpp 复制代码
#include <stdio.h>

·定义静态本地变量

cpp 复制代码
void jishu() {
    static int jingtai = 0;
    jingtai++;
    printf("函数被调用了 %d 次\n", jingtai);
}

·主函数

cpp 复制代码
int main() {
    jishu();
    jishu();
    jishu();
    return 0;
}

⬇️

2.3 静态本地变量实际上是全局变量

从内存分配的角度来看,静态本地变量和全局变量存在相似之处。

静态本地变量和全局变量都存于静态存储区,在程序开始执行时就会被分配内存,并且在程序的整个运行期间都存在,

不过,静态本地变量的作用域被限时在定义它的函数内部,在函数外部无法直接访问,这和全局变量有所不同。

·引用头文件

cpp 复制代码
#include <stdio.h>

·定义全局变量

cpp 复制代码
int quanju = 10;

·定义静态变量&分别打印静态变量和全局变量的地址

cpp 复制代码
void testFunction() {
    static int jingtai = 20;
    printf("全局变量 quanju 的地址: %p\n", &quanju);
    printf("静态本地变量 jingtai 的地址: %p\n", &jingtai);
}

·主函数

cpp 复制代码
int main() {
    testFunction();
    return 0;
}

⬇️

2.4 静态本地变量的生存期和作用域

生存期

静态本地变量的生存期从程序开始执行一直到程序结束,这和全局变量是一样的。也就是说,在程序运行期间,不管函数被调用多少次,静态本地变量始终存在于内存中,其值会一直保持。

作用域

静态本地变量的作用域是定义它的函数内部。在该函数外部,无法直接访问这个静态本地变量。


个人主页

最近生病了,真的特别难受,还有之前期中有点忙就没更新

相关推荐
genggeng不会代码30 分钟前
用于协同显著目标检测的小组协作学习 2021 GCoNet(总结)
学习
lwewan32 分钟前
26考研——存储系统(3)
c语言·笔记·考研
搞机小能手1 小时前
六个能够白嫖学习资料的网站
笔记·学习·分类
The_cute_cat3 小时前
25.4.22学习总结
学习
冰茶_4 小时前
.NET MAUI 发展历程:从 Xamarin 到现代跨平台应用开发框架
学习·microsoft·微软·c#·.net·xamarin
祁同伟.4 小时前
【数据结构 · 初阶】- 堆的实现
c语言·数据结构
夜夜敲码4 小时前
C语言教程(十六): C 语言字符串详解
c语言·开发语言
帅云毅4 小时前
Web3.0的认知补充(去中心化)
笔记·学习·web3·去中心化·区块链
豆豆4 小时前
day32 学习笔记
图像处理·笔记·opencv·学习·计算机视觉
宋康4 小时前
C语言结构体和union内存对齐
c语言·开发语言