当我们定义一个静态变量时,它的存储位置决定了它是内部静态变量还是外部静态变量。
内部静态变量是在函数内部定义的静态变量,它只能在定义它的函数中使用,也就是说,这个静态变量的作用域只在这个函数内部。
外部静态变量是在函数外部定义的静态变量,它可以在整个程序中使用,但是作用域仅限于定义它的文件内部。
总体而言,静态变量都有着不会随时被销毁的特点,程序真正运行的时候只会产生一次内存的分配,所以相比于普通的局部变量它们具有更长的生命周期和更加可靠的状态存储。
下面通过两个具体例子来更好地理解内部静态变量与外部静态变量的区别:
示例1: 内部静态变量
#include <stdio.h>
void my_func()
{
static int cnt = 0; //定义一个内部静态变量cnt,并且初始化为0
printf("The cnt is %d\n", cnt);
cnt++; //每次调用cnt都加1
}
int main()
{
my_func(); //第1次调用
my_func(); //第2次调用
my_func(); //第3次调用
return 0;
}
输出结果为:
The cnt is 0
The cnt is 1
The cnt is 2
通过上述程序,我们首先定义了一个内部静态变量cnt,并且初始化为0。接着我们在my_func()函数中每次调用cnt都加1。由于这里定义的是一个内部静态变量,所以cnt的值不会因为函数的结束而被销毁,而是一直存在,所以每一次调用cnt的值都会被正确地累加。
示例2: 外部静态变量
文件a.c
#include <stdio.h>
static int cnt = 0; //定义一个外部静态变量cnt,并且初始化为0
void a_func()
{
printf("The cnt in a_func is %d\n", cnt);
cnt++; //每次调用cnt都加1
}
文件b.c
#include <stdio.h>
extern void a_func(); //声明外部函数a_func
void b_func()
{
a_func(); //调用函数a_func
a_func(); //再次调用函数a_func
a_func(); //再次调用函数a_func
}
文件main.c
#include <stdio.h>
extern void b_func(); //声明外部函数b_func
int main()
{
b_func(); //调用函数b_func
return 0;
}
输出结果为:
The cnt in a_func is 0
The cnt in a_func is 1
The cnt in a_func is 2
通过上述程序,我们定义了一个外部静态变量cnt,并且初始化为0。不同于内部静态变量,外部静态变量的作用域不限于函数内部,而是作用于整个文件中。我们在文件a.c中定义了一个静态函数a_func(),打印输出变量cnt的值并加1。接着在文件b.c中再定义一个函数b_func(),该函数调用了a_func()三次。最终我们在main函数中调用b_func(),就可以看到在不同的调用中cnt的值被成功持续累加,说明外部静态变量的作用域确实是整个文件,可以被不同的函数共享使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言内部静态变量与外部静态变量的区别 - Python技术站