首页 > 编程笔记

C语言static静态变量(附带示例)

C语言静态类型的变量占用静态存储区,用 static 关键字来说明。其一般形式如下。

static 类型 变量名;

例如:

static int a;

静态类型又分为静态局部变量和静态全局变量。C 语言规定静态局部变量有默认值,int 型等于 0,float 型等于 0.0,char 型为 '\0',静态全局变量也如此。而自动变量和寄存器变量没有默认值,值为随机数。

如果您不了解全局变量和局部变量,请转到:C语言变量作用域

C语言静态局部变量

定义在函数内的静态变量称为静态局部变量。关于静态局部变量的几点说明如下。
  1. 静态局部变量是存储在静态存储区的,所以在整个程序开始时就被分配固定的存储单元,整个程序运行期间不再被重新分配,故其生存期是整个程序的运行期间。
  2. 静态局部变量本身也是局部变量,具有局部变量的性质,即其作用域是局限在定义它的本函数体内的。如果离开了定义它的函数,该变量就不再起作用,但其值仍然存在,因为存储空间并未释放。
  3. 静态局部变量赋初值的时间是在编译阶段,并且只被赋初值一次,即使它所有的函数调用结束,也不释放存储单元。因此不管调用多少次该静态局部变量的函数,它仍保留上一次调用函数时的值。

【示例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

程序从 main() 函数开始运行,此时 fac() 函数内的静态局部变量 f 已在静态存储区初始化为 1。

fac()函数被多次调用后的值:

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

本例由两个文件构成——1.c 和 2.c。2.c 中定义了主函数,1.c 中定义了子函数 f()。

程序仍是从包含主函数的文件开始执行。在 2.c 中定义了一个全局变量 n,对子函数作了一个声明。执行主函数,n=100,作用域范围小的优先,先输出局部变量 100。

调用子函数,在 1.c 中定义了静态全局变量 n,此时这里的 n 被赋的初值为 0,因为是静态的,所以会自动赋值。这个子函数输出的是 0*5=0。所以这两个n是互不干涉的,静态全局变量n对其他源文件无效,只在定义它的程序文件中有效。

优秀文章