前言: 在 C 语言中,static 关键字不仅可以用来修饰变量,还可以用来修饰函数。在使用 static 关键字修饰变量时,我们称此变量为静态变量。静态变量的存储方式与全局变量一样,都是静态存储方式。
static 的修饰
-
修饰全局变量
static int g_flag1 = 1; int g_flag2 = 2;
这两个变量都存储在静态/全局数据区。static 修饰的全局变量 g_flag1 只能在本文件可见,其他文件不可见;但 g_flag2 可在其他文件中通过 extern int g_flag2 来访问。
-
修饰局部变量
void func() { static int i = 0; // static 修饰局部变量 i ++i; printf("i = %d ", i); int j = 0; // 局部变量 j ++j; printf("j = %d\n", j); return; } void main() { func(); func(); func(); }
func 函数中 static 修饰的变量 i 存储在静态/全局数据区,因此函数调用结束时,变量 i 中会保留 func 函数上一次调用结束时的值。执行结果如下图:
结果显示,static 修饰的局部变量 i 的值会被累加,打印 1 2 3,而未修饰的变量 j 每次都会被初始化,一直打印 1 -
修饰函数
static void func() {}
static 对函数的修饰作用和对全局变量的修饰相似,使得被修饰函数只能在当前文件中调用,不能在同一程序的其他文件中调用。
static 的作用
-
隐藏与隔离的作用
全局变量虽然属于静态存储方式,但并不是静态变量。全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,全局变量在各个源文件中都是有效的。
如果我们希望全局变量仅限于在本源文件中使用,在其他源文件中不能引用,也就是说限制其作用域只在定义该变量的源文件内有效,而在同一源程序的其他源文件中不能使用。这时,就可以通过在全局变量之前加上关键字 static 来实现,使全局变量被定义成为一个静态全局变量。这样就可以避免在其他源文件中引起的错误。也就起到了对其他源文件进行隐藏与隔离错误的作用,有利于模块化程序设计。
-
保持变量内容的持久性
有时候,我们希望函数中局部变量的值在函数调用结束之后不会消失,而仍然保留其原值。即它所占用的存储单元不释放,在下一次调用该函数时,其局部变量的值仍然存在,也就是上一次函数调用结束时的值。这时候,我们就应该将该局部变量用关键字 static 声明为“静态局部变量”。
-
默认初始化为 0
在静态/全局数据区,内存中所有的字节默认值都是 0x00。静态变量与全局变量也一样,它们都存储在静态/全局数据区中,因此其变量的值默认也为 0。