一、先明确:三类变量的定义方式
这是区分三者的第一判断标准,直接决定变量的所有特性:
| 变量类型 | 定义位置 | 是否加 static 关键字 |
|---|---|---|
| 局部变量 | 函数/代码块内 | ❌ 不加 |
| 静态局部变量 | 函数/代码块内 | ✅ 加 |
| 普通全局变量 | 函数外(文件顶部) | ❌ 不加 |
| 文件静态全局变量 | 函数外(文件顶部) | ✅ 加 |
二、局部变量(auto 变量):'临时短命'的自动变量
1. 核心特性
- 作用域:仅定义所在的函数/代码块内可见,离开作用域立即不可见
- 存储期:自动存储期(进入代码块时创建,离开时销毁)
- 链接属性:无链接(仅当前作用域内的名字有效,其他区域无法引用)
- 内存位置:默认在栈区;编译器优化(如 -O2 级别)时可能存入寄存器(不占用栈空间)
- 初始化规则:
- C 语言:不初始化则是随机垃圾值(栈内存未清零,残留旧数据);
- C++:对象会每次进入代码块重新构造、离开时析构(析构顺序与构造顺序相反)
- 并发&可重入:每个线程有独立栈,天然线程私有,支持递归/可重入(无共享状态,无副作用)
2. 代码示例:
void tempCalc() {
int num = 1; // 局部变量(函数内、无 static)
num++;
printf("当前 num:%d\n", num); // 每次调用输出 2(进函数创建→+1→出函数销毁)
}
int main() {
tempCalc(); // 输出 2
tempCalc(); // 输出 2(重新创建 num=1)
return 0;
}
3. 使用场景
临时计算、函数参数、循环变量(如 for(int i=0;…) )等无需保留状态的场景,是代码中最常用的变量类型。
三、静态局部变量:"函数内常驻"的封装型变量
1. 核心特性
- 作用域:仅定义所在的函数/代码块内可见(封装性强,外部无法访问)
- 存储期:静态存储期(从程序启动到进程结束,全程存在)—— 内存在程序启动时分配,初始化仅执行 1 次
- 链接属性:无链接(仅当前代码块内有效)
- 内存位置:静态区/数据段(细分:已初始化非只读→ .data 段、未初始化→ .bss 段、只读→ .rodata 段)

