有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为静态局部变量,用关键字static进行声明。
通过用static类型声明后的变量,其变量的内存空间位于内存的全局静态区,仅会初始化一次,这是一个非常重要的特性,请大家通过如下的程序理解:
#include<stdio.h>
static a=5;
int fun()
{
a=a*2;
printf("a=%d\n",a);
return 0;
}
int main()
{
int i=0;
for(i=0;i<10;i++)
{
fun();
}
return 0;
}
请大家先自行理解,然后上机运行如上代码,可以观察a的值输出如下:
a=10
a=20
a=40
a=80
a=160
a=320
a=640
a=1280
a=2560
a=5120
#include <stdio.h> //<>所表示的头文件,属于系统包含
//#include "max.h" //""所表示的头文件,属于用户自己定义
static int g_a=1000; //全局变量,从定义的地方开始,到文件结束,所包含的函数都可以使用
int main() //有且仅有一个,也成为入口函数,
{
int m_a=100; //局部变量
prit(m_a);
// prit(m_a);
// prit(m_a);
// printf("\n") ;
//
// printf("m_a=%d\n", m_a);
// g_a += 100;
// printf("g_a=%d\n", g_a);
// extern g_b; //声明变量,不开辟空间,声明可以改变作用域
// g_b += 100;
// printf("g_a=%d\n", g_b);
return 0;
}
static int g_b=1000; //全局变量,从定义的地方开始,到文件结束,所包含的函数都可以使用
//函数之间是平时的,只有调用关系
//局部变量全称:局部静态变量
void prit(int a) //局部变量,当函数调用时,才定义变量
{
auto int aa=110; //局部变量,当函数调用时,才定义变量
// printf("prit_a=%d\n",a);
// printf("prit_aa=%d\n",aa);
// g_a += 200;
// printf("g_a=%d\n", g_a);
g_b += 200;
printf("g_a=%d\n", g_b);
// printf("aa = %d\n", aa);
// {
// int aa=100; //局部变量,位置是复合语句,块作用域
// printf("aa =%d\n",aa);
//
// }
// printf("aa = %d\n", aa);
// static int c=1; //静态局部变量,静态区
// c +=5;
// printf("a = %d\n",c);
}
这个结果的原因在于,每次a的值是接着上一次函数调用的值继续运算的,并非每次都初始化从5开始计算,这就是static的特性。