一、定义和声明
静态变量是一种在程序执行期间内保持其值不变的变量。static关键字用于定义静态变量和函数。静态变量可以在函数内,也可以在全局作用域内声明,其作用域都在声明点之后的整个程序期间内有效。
在函数内声明的静态变量,该变量只会被初始化一次,并且仅在该函数被第一次调用时分配存储空间。之后,该变量的值将保持其上一次的值,而不管该函数被调用了多少次。
#include<stdio.h>
void func()
{
static int count = 0; // 声明静态变量
count++;
printf("count: %d\n", count);
}
int main()
{
func(); // 输出count: 1
func(); // 输出count: 2
func(); // 输出count: 3
return 0;
}
二、生命周期
静态变量的生命周期为整个程序期间。也就是说,静态变量一旦被分配了存储空间,就一直存在于程序的数据区中,直到程序结束才会被释放。这与自动变量不同,自动变量的生命周期仅在函数执行期间内。
因此,在使用静态变量时需要注意变量的值在不同函数调用之间是否需要保持一致,以避免出现不可预料的结果。
三、作用域
静态变量的作用域和自动变量的作用域相同。在函数内声明的静态变量,只能在该函数内部使用,不能在函数外部被访问。在全局作用域内声明的静态变量,可以在整个程序中被访问,但只能在定义该变量的文件中被使用。
#include<stdio.h>
static int a = 1; // 声明全局静态变量
void func()
{
static int count = 0; // 声明函数内静态变量
count++;
printf("count: %d, a: %d\n", count, a);
}
int main()
{
func(); // 输出count: 1, a: 1
func(); // 输出count: 2, a: 1
a++;
func(); // 输出count: 3, a: 2
return 0;
}
四、可见性
静态变量的作用域内可见,但在作用域外是不可见的,这种特性对于实现模块化编程非常有用。
在一个源文件中,可以定义多个静态变量,这些变量是不可见的,只有定义它们的函数才能访问到它们。这样可以避免因为变量重名而引起的命名冲突。
五、初始化
静态变量可以被初始化,也可以不被初始化。如果不被初始化,静态变量的初值为0。
在函数内声明的静态变量,其初始值只被设定一次。在下一次调用该函数时,该变量仍然具有上次执行结束时的值。
#include<stdio.h>
void func()
{
static int count; // 声明未被显式初始化的静态变量
count++;
printf("count: %d\n", count);
}
int main()
{
func(); // 输出count: 1
func(); // 输出count: 2
func(); // 输出count: 3
return 0;
}