C语言 static关键字的使用

static关键字在C语言中是一个非常重要的关键字,它主要用于修饰变量和函数,用来控制变量和函数的作用域和生命周期。合理使用static关键字,可以提高程序的模块化、可读性和效率。

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

推荐阅读
cjavapy编程之路首页