在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 静态本地变量的生存期和作用域
生存期
静态本地变量的生存期从程序开始执行一直到程序结束,这和全局变量是一样的。也就是说,在程序运行期间,不管函数被调用多少次,静态本地变量始终存在于内存中,其值会一直保持。
作用域
静态本地变量的作用域是定义它的函数内部。在该函数外部,无法直接访问这个静态本地变量。
最近生病了,真的特别难受,还有之前期中有点忙就没更新