C语言内部静态变量与外部静态变量的区别

  • Post category:C

C语言中有两种类型的静态变量:内部静态变量和外部静态变量。它们的作用域不同,原因是它们的存储类别不同。下面我们详细解释内部静态变量和外部静态变量之间的区别。

内部静态变量

内部静态变量是同时拥有静态(static)存储类别和块作用域(局部作用域)的变量。它们仅在声明它们的块(函数或代码段)的作用域中可见。这意味着,即使在同一文件中其它函数拥有相同名称的变量,内部静态变量也只在声明它们的函数内部可见。

内部静态变量的生命周期在程序执行时保持不变,即使它们的块执行结束后,它们的值也不会被销毁,仍然存在于内存中。可以通过声明内部静态变量来实现“变量状态保持”,从而确保变量仅在该函数或代码段中持久存在。

下面是一个示例,展示如何在函数内部声明和使用内部静态变量。

#include <stdio.h>

void test_func() {
    static int count = 0;
    count++;
    printf("count is %d\n", count);
}

int main() {
    test_func(); // count is 1
    test_func(); // count is 2
    test_func(); // count is 3
    return 0;
}

在这个示例中,test_func() 函数中定义了一个内部静态变量 count,并对其加 1,并将结果输出到控制台。每当 test_func() 函数被调用时,count 的值会自增,并一直存在于内存中,直到程序运行结束。

外部静态变量

外部静态变量也拥有静态存储类别,但它们拥有文件作用域。这意味着,即使它们在一个源文件中的某个函数之内声明,它们也可以被在同一文件中定义的任何函数所访问。

外部静态变量会在程序执行前被初始化(赋初值为 0),并会在程序退出之后才被销毁。

下面是一个示例,展示如何在不同函数间定义和使用外部静态变量。

#include <stdio.h>

static int total_count = 0; // 外部静态变量

void test_func_a() {
    total_count++;
    printf("total count from test_func_a is %d\n", total_count);
}

void test_func_b() {
    total_count++;
    printf("total count from test_func_b is %d\n", total_count);
}

int main() {
    test_func_a(); // total count from test_func_a is 1
    test_func_b(); // total count from test_func_b is 2
    test_func_a(); // total count from test_func_a is 3
    return 0;
}

在这个示例中,我们在两个不同的函数中定义了一个外部静态变量 total_count。这两个函数可以通过该变量进行通信,并将变量的值增加 1。和内部静态变量不同,这个变量是在函数外部定义的,并且可以在不同的函数和代码段中进行访问。

这两个示例展示了内部静态变量和外部静态变量之间的区别。最重要的区别是它们的作用域不同,所以要根据需要来选择其中的任何一个。