C语言static静态变量(附带示例)
C语言静态类型的变量占用静态存储区,用 static 关键字来说明。其一般形式如下。
如果您不了解全局变量和局部变量,请转到:C语言变量作用域
【示例1】静态局部变量示例:打印 1~5 的阶乘。
fac()函数被多次调用后的值:
如果编写的程序是在一个源文件中实现的,那么一个全局变量和一个静态全局变量是没有区别的。但是,有时一个C源程序是由多个文件组成的,那么全局变量和静态全局变量在使用上是完全不同的,一个文件可以通过外部变量声明使用另一个文件中的全局变量,但无法使用静态全局变量,静态全局变量只能被定义它的文件所独享。
静态全局变量的特点如下。
【示例2】静态全局变量示例:新建一个项目,并创建名为 1.c 的文件。
程序仍是从包含主函数的文件开始执行。在 2.c 中定义了一个全局变量 n,对子函数作了一个声明。执行主函数,n=100,作用域范围小的优先,先输出局部变量 100。
调用子函数,在 1.c 中定义了静态全局变量 n,此时这里的 n 被赋的初值为 0,因为是静态的,所以会自动赋值。这个子函数输出的是 0*5=0。所以这两个n是互不干涉的,静态全局变量n对其他源文件无效,只在定义它的程序文件中有效。
static 类型 变量名;
例如:static int a;
静态类型又分为静态局部变量和静态全局变量。C 语言规定静态局部变量有默认值,int 型等于 0,float 型等于 0.0,char 型为 '\0',静态全局变量也如此。而自动变量和寄存器变量没有默认值,值为随机数。如果您不了解全局变量和局部变量,请转到:C语言变量作用域
C语言静态局部变量
定义在函数内的静态变量称为静态局部变量。关于静态局部变量的几点说明如下。- 静态局部变量是存储在静态存储区的,所以在整个程序开始时就被分配固定的存储单元,整个程序运行期间不再被重新分配,故其生存期是整个程序的运行期间。
- 静态局部变量本身也是局部变量,具有局部变量的性质,即其作用域是局限在定义它的本函数体内的。如果离开了定义它的函数,该变量就不再起作用,但其值仍然存在,因为存储空间并未释放。
- 静态局部变量赋初值的时间是在编译阶段,并且只被赋初值一次,即使它所有的函数调用结束,也不释放存储单元。因此不管调用多少次该静态局部变量的函数,它仍保留上一次调用函数时的值。
【示例1】静态局部变量示例:打印 1~5 的阶乘。
#include <stdio.h> long fac(int n) { static long f=1; /*定义静态局部变量f,仅初始化一次,在静态存储区分配空间*/ f=f*n; return f; } main() { int k; for(k=1;k<=5;k++) printf("%d!=%ld\n",k,fac(k)); printf("\n"); }运行结果:
1!=1
2!=2
3!=6
4!=24
5!=120
fac()函数被多次调用后的值:
- 第 1 次调用 fac() 函数时,f=1*1=1,第 1 次调用结束并不会释放 f,仍保留 1。
- 第 2 次调用 fac() 函数时,f=1*2=2(其中 1 仍是上次保留的结果),第 2 次调用结束 f 的值仍保留为 2。
- 第 3 次调用,f=2*3=6,f 内这次保留的是 6。
- 第 4 次调用的结果为 24,第 5 次调用的结果为 120(24*5)。
C语言静态全局变量
在定义全局变量时前面加上关键字 static,就是静态全局变量。如果编写的程序是在一个源文件中实现的,那么一个全局变量和一个静态全局变量是没有区别的。但是,有时一个C源程序是由多个文件组成的,那么全局变量和静态全局变量在使用上是完全不同的,一个文件可以通过外部变量声明使用另一个文件中的全局变量,但无法使用静态全局变量,静态全局变量只能被定义它的文件所独享。
静态全局变量的特点如下。
- 静态全局变量与全局变量基本相同,只是其作用范围(即作用域)是定义它的程序文件,而不是整个工程项目。
- 静态全局变量属于静态存储类别的变量,它在程序开始运行时就被分配固定的存储单元,所以其生存期是整个程序运行期间。
- 使用静态全局变量的好处是,同一项目的两个不同的源文件中可以使用相同名称的变量名,而且互不干扰。
【示例2】静态全局变量示例:新建一个项目,并创建名为 1.c 的文件。
#include<stdio.h> static int n; /*定义静态全局变量n*/ void f(int x) { n=n*x; printf("%d\n",n); }创建名为 2.c 的文件:
#include<stdio.h> int n; /*定义全局变量*/ void f(int); int main() { n=100; printf("%d\n",n); f(5); } #include<stdio.h> int n; /*定义全局变量*/ void f(int); int main() { n=100; printf("%d\n",n); f(5); }运行结果:
100
0
程序仍是从包含主函数的文件开始执行。在 2.c 中定义了一个全局变量 n,对子函数作了一个声明。执行主函数,n=100,作用域范围小的优先,先输出局部变量 100。
调用子函数,在 1.c 中定义了静态全局变量 n,此时这里的 n 被赋的初值为 0,因为是静态的,所以会自动赋值。这个子函数输出的是 0*5=0。所以这两个n是互不干涉的,静态全局变量n对其他源文件无效,只在定义它的程序文件中有效。