静态变量
静态变量存放在内存中的静态存储区。编译系统为其分配固定的存储空间。静态变量定义的形式是:
static 类型标识符 变量名;
静态变量有两种:一种是外部静态变量,另一种是内部静态变量。
(1)外部静态变量。如果希望在一个文件中定义的外部变量的作用域仅局限于此文件中,而不能被其它文件所访问,则可以在定义此外部变量的类型说明符的前面使用static关键字。如:

static float f;

此时, f被称为静态外部变量(或称为外部静态变量),只能在本文件中使用,在其它文件中,即使使用了extern说明,也无法使用该变量

 

static int x, y;                         /*x与y只是适用于本文件的全局变量*/
 #include <stdio.h>
 main()
 {        
                 scanf("%d%d",&x,&y);
         swap();
         printf("x=%d, y=%d/n",x,y);
 }

 /*file2.c*/
 extern int x, y;                /*实际上x, y没有定义*/
 swap()
 {        
                 int t;
         t=x; x=y; y=t;
         return;
 }



这一程序是错误的。这是因为,在主函数所在的文件file1.c中定义的全局变量x、y只适用于本文件,而在函数swap( )所在文件file2.c中试图将它们说明为外部变量而使用它们,这是不可能的。因此,上述程序在编译连接时会指出x、y没有定义的错误。

 

 

内部静态变量。如果希望在函数调用结束后仍然保留函数中定义的局部变量的值,则可以将该局部变量的类型说明符前加一个static关键字,说明为内部静态变量。
例8.35  编一个程序,每调用一次函数,显示一静态局部变量中内容,然后为其值加2。

#include <stdio.h>
 void test_static()
 {        
         static int sv=0;
         printf("static=%d/n",sv);
         sv=sv+2;
 }

 main()
 {        
                 int i;
         for(i=0;i<4;i++)
                 test_static();
 }



上述程序的执行结果如下:

static=0
 static=2
 static=4
 static=6



test_static( )函数中,静态变量sv的初始值为0。但是只有在test_static( )函数第一次调用执行时sv被初始化为0,以后每次调用就不再进行初始化,而把上次的计算结果作为初始值 ,因此,两次相同的调用出现不同的计算结果。如果将sv定义为动态变量,就会出现不同的结果

 

 

#include <stdio.h>
 void test_static()
 {        
                 int sv=0;
         printf("static=%d/n",sv);
         sv=sv+2;
 }

 main()
 {        
                 int i;
         for(i=0;i<4;i++)
                 test_static();
 }



上述程序的执行结果如下:

static=0
 static=0
 static=0
 static=0


注意:
静态变量如果在定义时没有赋初始值,系统会用默认值对它进行初始化,数值变量默认初始化为0,字符变量默认初始化为空字符(即ASCII码为0的字符)