【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_arr5; 数组元素均为 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 静态本地变量的生存期和作用域

生存期

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

作用域

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


个人主页

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

相关推荐
aramae9 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
无敌贵点大王10 小时前
RTThread学习记录11——RT-Thread 设备模型吃透:UART/ADC/PWM/PIN 到底有什么区别?
c语言·stm32·学习·链表
Logic10110 小时前
C语言/数据结构位运算题解:异或XOR找出时尚聚会中的“独特颜色“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
是翎11 小时前
深度长文|2026产品经理AI实践手册
人工智能·深度学习·学习·自然语言处理·数据挖掘
Linux-lucky12 小时前
32-38-Linux学习之旅之MySQL综合
linux·运维·学习·mysql·ubuntu
知识分享小能手13 小时前
C++ 学习教程,从入门到精通,C++ 入门知识 — 完整知识点(1)
开发语言·c++·学习
Escalating_xu15 小时前
【C 语言项目】数组和函数综合实践:从零实现控制台扫雷游戏
c语言
AI职业加油站15 小时前
数据要素价值释放年:大数据治理工程师,站上职业新风口
人工智能·学习·职场和发展·数据分析·职场发展
啄缘之间16 小时前
1.【SVA】什么是SVA?
经验分享·学习·测试用例·verilog·sva
sunoo-22917 小时前
【嵌入式裸机开发Day04】i.MX6ULL 蜂鸣器驱动详解:从引脚地址查找到代码实现全流程
arm开发·单片机·嵌入式硬件·学习·串口·裸机