作用域(scope)决定一个变量能在哪里被访问。理解作用域后,你会更容易看懂函数内部变量和外部变量之间的关系。
局部变量
定义在函数内部的变量称为局部变量(local variable)。它只能在函数内部访问。函数执行结束后,这些局部变量就会被销毁。函数参数也是函数内部的局部变量。
下面的 swap() 看起来交换了 a 和 b,但它交换的是自己的局部变量。可以把 main() 和 swap() 想成两个不同的房间:两个房间里都可以有叫 a 的盒子,但它们不是同一个盒子。
#include <stdio.h>
void swap(int a, int b) {
int temporary = a;
a = b;
b = temporary;
printf("函数内部:a = %d,b = %d\n", a, b);
}
int main(void) {
int a = 1;
int b = 2;
printf("交换前:a = %d,b = %d\n", a, b);
swap(a, b);
printf("交换后:a = %d,b = %d\n", a, b);
return 0;
}运行结果:
交换前:a = 1,b = 2
函数内部:a = 2,b = 1
交换后:a = 1,b = 2互动实验
局部作用域与同名变量
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
知识测验
题目
调用 swap(a, b) 时,swap() 中的 a 和 main() 中的 a 是什么关系?
文件作用域与 static
在所有函数之外声明的变量具有文件作用域。加上 static 后,这个名称只在当前源文件中可见,同时该文件内的函数仍可以共享它的值。
静态变量在程序运行期间只保留一份。一个静态函数修改它以后,其他静态函数再次读取时会看到更新后的值。
#include <stdio.h>
static int score = 0;
static void add_score(int points) {
score += points;
}
static int get_score(void) {
return score;
}
int main(void) {
add_score(10);
add_score(5);
printf("%d\n", get_score());
return 0;
}运行结果:
15只有当状态确实属于当前模块时,才应使用文件作用域的静态变量。应集中通过明确的函数修改它,避免程序中的任意位置随意赋值。
知识测验
题目
哪个关键字可以把文件作用域变量的名称限制在当前源文件?
动手练习
维护模块分数板
使用文件作用域的静态 score,并比较它与同名局部参数。
- 创建 static int score = 0。
- 在 add_points() 中更新共享分数。
- 证明 preview_message(score) 的参数不会修改共享值。