一、问题
在编写程序的过程中,对于某些函数的局部变量的值,有时不希望它在函数调⽤结束后消失,也就是不释放该变量所占⽤的存储单元;同样,有时在程序设计中也希望某些外部变量只限于被本⽂件引⽤。这就需要使⽤静态变量来实现了,那么什么是静态变量?如何应⽤呢?
二、解答
通常使⽤关键字 static 对变量进⾏声明,实现静态变量。
1、静态局部变量
在局部变量的声明前再加上 static 声明符,就构成静态局部变量。
例如:
static int a,b;
static float x,y;
static int a[3] = {0,1,2};
静态局部变量属于静态存储⽅式,具有以下特点。
- 静态局部变量在函数内定义,但不像⾃动变量那样,当调⽤时就存在,退出函数时就消失。静态局部变量属于静态存储类型,在静态存储区内分配存储单元,在程序整个运⾏期间都不释放,即静态局部变量始终存在,也就是说其⽣存期为整个源程序。
- 静态局部变量的⽣存期虽然为整个源程序,但是其作⽤域仍与⾃动变量相同,即只能在定义该变量的函数内使⽤该变量。退出该函数后,尽管该变量还继续存在, 但不能使⽤它。再次调⽤定义它的函数时,它又可继续使⽤。
- 对基本类型的静态局部变量若在声明时未赋予初值,则系统⾃动赋予 0 值;⽽对⾃动变量若不赋初值,则其值是不定的。
下⾯来看⼀个⽤静态局部变量来求累加和的例⼦,代码如下。
#include <stdio.h>
int add(int x)
{static int n = 0;n = n + x;return n;
}
int main()
{int i, j, sum;printf("Please input the number:\n");scanf("%d", &i);printf("The result is:\n");for (j = 1; j <= i; j++){sum = add(j);printf("%d:%d\n", j, sum);}
}
程序运⾏结果如下所示。
Please input the number:
6
The result is:
1:1
2:3
3:6
4:10
5:15
6:21
从上述程序可以看出,静态局部变量 n 是⼀种⽣存期为整个源程序的量。每次调⽤函数add( ) 时,静态局部变量 n 都保存了前次被调⽤后留下的值。因此,当需要多次调⽤⼀个函数且要求在后⼀次调⽤时使⽤前⼀次调⽤保留的某些变量的值时,可考虑采⽤静态局部变量。
如果将函数 add( ) 中的 static 改成 auto,则运⾏结果如下所示。
Please input the number:
6
The result is:
1:1
2:2
3:3
4:4
5:5
6:6
如上所示的运⾏结果可以看出,⾃动变量占⽤动态存储区空间,⽽不占⽤静态存储区空间;每次调⽤后变量 n 的值都释放,每当再调⽤时 n 的值都从 0 开始。
2、静态全局变量
在全局变量的变量类型声明之前加上 static, 就构成了静态的全局变量。全局变量本身就是静态存储⽅式,静态全局变量⾃然也是静态存储⽅式。
这两者在存储⽅式上并⽆不同, 其区别主要在于作⽤域不同。⾮静态全局变量的作⽤域是整个源程序,当⼀个源程序由多个源⽂件组成时,⾮静态全局变量在各个源⽂件中都是有效的。例如,在 file1.e 中定义了 ⾮静态全局变量 XX,则在其他的源⽂件(如 file2.c)中也可以调⽤。
静态全局变量则限制了其作⽤域,即只在定义该变量的源⽂件内有效,在同⼀源程序的其他源⽂件中不能使⽤它。例如,在 filel.c 中定义了静态全局变量 YY,则在其他的源⽂件(如 file2.c) 中则不能调⽤。
说明:
static 这个声明符在不同的地⽅所起的作⽤是不同的。把局部变量改变为静态变量后,
改变的是它的存储⽅式,即改变了其⽣存期;把全局变量改变为静态变量后改变的是它的
作⽤域,限制了其使⽤范围。
三、总结
在开发⼀个较⼤程序时,往往是由若⼲个⼈分⼯完成,即每个⼈完成各⾃负责的模块。每个⼈可以独⽴地在其设计的⽂件中使⽤相同的外部变量名⽽互不相⼲,前提是在定义的外部变量前⾯加上 static,使其成为静态外部变量。这样⼤⼤地提⾼了程序的模块化和通⽤性。