1、静态局部变量
限于函数内部,类似于普通局部变量。整个程序运行期间,而不仅仅是函数执行期间。默认初始化为 0
。
#include <stdio.h>
void staticVariableExample() {
static int count = 0; // 静态局部变量
count++;
printf("函数被调用了 %d 次\n", count);
}
int main() {
staticVariableExample(); // 输出: 函数被调用了 1 次
staticVariableExample(); // 输出: 函数被调用了 2 次
staticVariableExample(); // 输出: 函数被调用了 3 次
return 0;
}
2、静态全局变量
限于定义它的文件中,其他文件无法访问。从程序开始到程序结束。用于避免全局命名冲突。
// file1.c
#include <stdio.h>
static int fileScopedVar = 42; // 静态全局变量
void printFileScopedVar() {
printf("fileScopedVar: %d\n", fileScopedVar);
}
// file2.c
extern int fileScopedVar; // 错误: 静态全局变量不能在其他文件中访问
3、 静态函数
限于定义它的文件中,其他文件无法访问。用于隐藏函数的实现,仅在模块内部使用。
// file1.c
#include <stdio.h>
static void helperFunction() { // 静态函数
printf("这是一个静态函数,仅在 file1.c 可见\n");
}
void publicFunction() {
helperFunction();
}
// file2.c
extern void helperFunction(); // 错误: 静态函数无法在其他文件中访问
4、静态成员变量 (C99)
C99 中,static
也可以用于数组参数,指示函数需要一个至少具有指定大小的数组。
#include <stdio.h>
void processArray(int arr[static 5]) {
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[5] = {1, 2, 3, 4, 5};
processArray(arr); // 输出: 1 2 3 4 5
return 0;
}
5、默认值
全局 static
变量或 static
修饰的函数,如果未显式初始化,static
修饰的变量默认初始化为 0
(整型)、0.0
(浮点型)或 NULL
(指针)。非 static
全局变量行为一致,但局部 static
变量与普通局部变量不同。
#include <stdio.h>
static int globalStatic; // 默认初始化为 0
void testStatic() {
static int localStatic; // 默认初始化为 0
printf("localStatic = %d\n", localStatic);
localStatic++;
}
int main() {
printf("globalStatic = %d\n", globalStatic); // 输出:0
testStatic(); // 输出:localStatic = 0
testStatic(); // 输出:localStatic = 1
return 0;
}