物协 C Gateway Course 5作用域
1. 作用域的概念
在C语言中,作用域是指程序中某个变量的可见范围,即变量在程序中起作用的区域。C语言中主要有以下两种作用域:
-
局部作用域(Local Scope): 在函数内声明的变量具有局部作用域,只在声明它的函数内部可见。
-
全局作用域(Global Scope): 在函数外部声明的变量具有全局作用域,整个程序中的任何地方都可以访问。
2. 局部作用域
2.1 局部变量
局部变量是在函数内部声明的变量。它们只在声明它们的函数内部可见,超出该函数的范围无法访问。局部变量的生命周期仅限于其所在的函数执行期间。
#include <stdio.h>
void exampleFunction() {
// 局部变量
int localVar = 5;
printf("Local Variable: %d\n", localVar);
}
int main() {
// 无法访问 exampleFunction 中的局部变量 localVar
// printf("Local Variable: %d\n", localVar); // 编译错误
return 0;
}
2.2 块作用域
在C99标准之后,可以在任意块(由花括号 {}
包围的区域)内声明变量。这样的变量具有块作用域,只在该块内可见。
#include <stdio.h>
int main() {
// 块作用域变量
{
int blockVar = 10;
printf("Block Variable: %d\n", blockVar);
}
// 无法访问块外的 blockVar
// printf("Block Variable: %d\n", blockVar); // 编译错误
return 0;
}
3. 全局作用域
3.1 全局变量
全局变量是在函数外部声明的变量,整个程序中的任何地方都可以访问。全局变量的生命周期从程序启动到程序结束。
#include <stdio.h>
// 全局变量
int globalVar = 20;
int main() {
// 访问全局变量
printf("Global Variable: %d\n", globalVar);
return 0;
}
3.2 文件作用域
如果在函数外部声明变量并未使用 static
关键字,则该变量具有文件作用域。文件作用域意味着该变量在整个文件中可见,但不能被其他文件访问。
// 文件1.c
#include <stdio.h>
int fileScopedVar = 30; // 具有文件作用域
// 文件2.c
// 无法访问文件1.c中的 fileScopedVar
// printf("File Scoped Variable: %d\n", fileScopedVar); // 编译错误
4. 函数参数的作用域
函数参数也具有局部作用域,它们只在函数内部可见。
#include <stdio.h>
void exampleFunction(int param) {
// param 具有局部作用域
printf("Parameter: %d\n", param);
}
int main() {
// 无法访问 exampleFunction 中的参数 param
// printf("Parameter: %d\n", param); // 编译错误
return 0;
}
5. 静态局部变量
使用 static
关键字声明的局部变量具有静态存储期,其生命周期贯穿整个程序运行期间,但只在声明它的函数内可见。
#include <stdio.h>
void exampleFunction() {
// 静态局部变量
static int staticLocalVar = 15;
printf("Static Local Variable: %d\n", staticLocalVar);
// 修改静态局部变量
staticLocalVar++;
}
int main() {
// 调用 exampleFunction 多次
exampleFunction();
exampleFunction();
exampleFunction();
return 0;
}
6. 笔记和联系
-
局部作用域: 局部变量在函数内部声明,生命周期仅限于函数执行期间。
-
全局作用域: 全局变量在函数外部声明,整个程序中的任何地方都可以访问。
-
块作用域: 使用块(花括号
{}
)内声明的变量具有块作用域,只在该块内可见。 -
文件作用域: 在文件中声明的变量具有文件作用域,对其他文件不可见。
-
函数参数作用域: 函数参数具有局部作用域,只在函数内部可见。
-
静态局部变量: 使用
static
关键字声明的局部变量具有静态存储期,生命周期贯穿整个程序运行期间。