文章目录
- 1 前言
- 2 static修饰局部变量
- 2.1 局部变量无static修饰
- 2.2 局部变量有static修饰
- 3 static修饰全局变量
1 前言
在C语言中,static是用来修饰变量和函数的:
- 修饰局部变量 - 称为静态局部变量
- 修饰全局变量 - 称为静态全局变量
- 修饰函数 - 称为静态函数
2 static修饰局部变量
2.1 局部变量无static修饰
局部变量是指在函数或代码块内部声明的变量,其特点是:
- 存储位置:局部变量通常存储在栈上;
- 初始化:局部变量在声明时,如果没有显式初始化,它的值是随机的;
- 生命周期:局部变量在函数或代码块执行时被创建,当执行结束后被销毁;
- 作用域:局部变量只能在其所在的函数或代码块内使用。
示例代码如下所示:
void test() {
//
int a = 1;
//
a++;
//
printf("%d ", a);
//
return;
}
int main()
{
//
int i = 0;
//
while (i < 10) {
test();
i++;
}
//
printf("\n");
//
return 0;
}
代码运行结果如下图所示:
代码及运行结果分析如下:
- 变量a是定义在test()函数中的局部变量,其作用域test()函数内部;当test()函数被调用时,变量a创建并初始化为2,当test()函数调用结束后,变量a被销毁;
- 在VS2019开发环境下,通过F11调试时会发现,变量a在调用test()函数时反复被创建。
2.2 局部变量有static修饰
当使用关键字static修饰局部变量时,局部变量的初始化、作用域、生命周期和存储位置都会发生变化:
- 存储位置:静态局部变量存储在静态存储区,而不是栈上;
- 初始化:静态局部变量在声明时,如果没有显式初始化,会被自动初始化为零(对于基本数据类型);如果有明确的初始化值,在第一次调用该函数时,会被初始化为指定的值,在后续的函数调用中,静态局部变量保持上次函数调用后的值,而不会被重新初始化;
- 生命周期:静态局部变量在程序开始运行时被创建,在程序结束运行时被销毁,在程序的整个运行期间都存在,其生命周期与程序的整个运行周期相同;
- 作用域:静态局部变量的作用域仍然局限于定义它的函数内部,外部函数无法访问这个变量;
示例代码如下所示:
void test() {
//
static int a = 1;
//
a++;
//
printf("%d ", a);
//
return;
}
int main()
{
//
int i = 0;
//
while (i < 10) {
test();
i++;
}
//
printf("\n");
//
return 0;
}
代码运行结果如下图所示:
代码及运行结果分析如下:
- 当有static修饰时,变量a变成静态局部变量,在调用test()函数并未重新创建和初始化。
3 static修饰全局变量
全局变量是指在所有函数外部声明的变量,其特点是:
- 存储位置:全局变量通常存储在静态区;
- 生命周期:全局变量在程序开始运行时被创建,在程序结束运行时被销毁,在程序的整个运行期间都存在;
- 作用域:全局变量可以在程序的所有函数中被访问和修改。
示例代码如下所示:
- 文件1
int main()
{
//
printf("g_val = %d\n", g_val);
//
return 0;
}
- 文件2
int g_val = 2024;
运行程序会提示错误,内容如下所示:
error C2065: “g_val”: 未声明的标识符
解决方法 在文件1中使用extern关键字引用文件2中声明的全局变量g_val,代码如下所示:
extern int g_val;
int main()
{
//
printf("g_val = %d\n", g_val);
//
return 0;
}
代码运行结果如下图所示:
代码及运行结果分析如下:
- 代码运行正常;
- 全局变量具有外部链接属性,这意味着它们可以在多个文件之间共享和访问;
- 当在一个源文件中引用另一个源文件中声明的全局变量,需要使用extern关键字。