最近发现了一本比较好的关于c语言的书叫做《c语言深度解剖》。我也是刚开始看,就遇到一个问题,就是c语言中static这个关键字的用法问题,我结合这本书及许多相关的资料个人认识弄清了这个问题,本着积累知识和共享的原则我认为有必要把它写下来。
总的来说static一共有两个作用
1、就是修饰变量
(1)、修饰外部变量(就是全局变量)
全局变量的前面加static使得该全i变量局成为静态全局变量。静态全局变量的作用于域仅限于变量被定义的文件中,其他文件即使使用extern声明也没法使用它。如下例
file1.c file2.c
static int A; extern int A;
void main() void fun(int n)
{ {
A=A*n;
} }
准确的说作用域是从定义处开始,到文件结尾处结束,在定义之处前面的那些代码行也不能使用它。想要使用就得在前面加extern。恶心吧想要不恶心,很简单,直接在文件顶端定义不就得了。
在程序设计中,常有若干人分别完成各个模块,个人可以独立地在其设计的文件中使用相同的外部变量名而不不干扰。只需在每个文件中的外部变量前加上static即可。这就是为程序的模块化、通用性提供了方便。如果其他文件不需要引用本文件的外部变量,可以对本文件中的外部变量都加上static,成为静态全局变量,以免被其他文件误用。
需呀指出:不要误认为对外部变量加static声明后才是静态存储方式(存放在静态存储区),而不加static的是动态存储区(存放动态变量)。两种形式的外部变量都是静态存储方式(存放在静态存储区),只是作用域范围不同而已,都是在编译时分配内存的。
(2)、修饰内部变量
有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值。这时就应该制定该变量为“静态局部变量”。用关键字static进行声明。如下例
}
i 1 2 3 4 5
j 1 1 1 1 1
对静态局部变量的说明:
(1)、静态局部变量属于静态存储类别,在静态存储区分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储区空间而不占静态存储区空间,函数调用结束后即释放。
(2)、对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。而对自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,没调用一次函数重新给一次初值,相当于执行一次赋值语句。
(3)、如在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则对他的值是不确定的。这是由于每次函数调用结束后存储单元已经释放,下次调用时又重新另外分配存储单元,而所分配的单元中的值是不确定的。
(4)、虽然静态局部变量在函数调用结束后仍然存在,但其它函数是不能引用他的。