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; }