原链接:http://gaga.yo2.cn/articles/detailed-c-language-variables-review.html
刚做题时发现全局变量会自动初始化,如int型则自动初始化为0,double则初始化为0.000000....。而局部变量如果没有初始化的话,初值为一随机数。于是很好奇,找了点资料,发现果然如此。
一。变量的存储类型
C语言中的变量存储类型有4种,分别为auto(自动变量),static(静态变量),extern(外部变量),register(寄存器变量)
1.全局变量的存储类型:
static和extern两种,其中extern是缺省的全局变量存储类型。
int x,y=5;//默认为外部全局变量
extern int a=1,b=2;//定义外部全局变量,使用关键字extern后,必须进行初始化!
static float f1,f2;//静态全局变量
void main()
{
..........
}
extern型全局变量通过外部全局变量说明可以被其他源程序引用,而static星的全局变量只能局限在本源程序文件中使用
如果使用了关键字extern,则必须对这个外部全局变量进行出示化,否则编译程序会把它当作外部变量的声明(说明)
2.局部变量的存储类型:
C语言种的局部变量的存储类型有如下3种:auto,static,register。其中auto是缺省的局部变量存储类型!
void main()
{
auto int a;//自动变量
fioat f;//自动变量
static int i;//静态变量
register double d;//寄存器变量,要求编译器使用CPU寄存器来存储变量值
}
C语言函数定义中的形参也是局部变量,形参的默认存储类型是auto,也可以指定形参的存储类型是register,但不允许指定形参的村塾类型为static!
二。变量的生存期
C语言的变量生存期有2种:全程生存期,动态生存期。
1.全程生存期
指变量在程序运行一开始就被建立,而在程序运行结束后才从内存中删除。
具有全程生存期的变量是全局变量和静态变量
具有全程生存期的变量存储在程序的静态数据存储区中
2.动态生存期
指变量在程序运行过程中,因需要使用才建立,而使用结束就被删除
具有动态生存期的变量有:局部自动变量,寄存器变量
具有动态生存期的变量存储在程序的动态数据区中
对于复合语句种定义的auto型的局部变量,每当程序运行至该语句时,就会在动态数据区建立这些局部变量的存储空间,而一旦程序流程离开该复合语句时,该复合语句种的局部变量将被系统从内存种删除
3.变量的初始化
具有全局生存期的变量(包括数组)在定义时如果没有初始化,则初值自动为0;而具有动态生存期的变量未初始化时,初值为一随机数!
具有全局生存期的变量在定义时如有初始化,则初始化在程序刚开始运行建立静态数据区时会被执行一次,以后再也不会执行初始化操作。而动态生存期的变量在定义时如有初始化,则每当程序创建该变量时都会执行初始化。
static double a[10];
int b[5];double x,y;static char ch;
void main()
{
static long p[8];
static float g;
}
上述变量都为全局生存期变量,所以初值都时0!
注意:如果在函数中使用静态局部变量,由于静态局部变量的初始化只执行一次,故当第2次调用该函数时,不会对静态局部变量进行再次初始化;又由于静态局部变量时全程生存期的,所以静态局部变量的值为上次结束函数调用时的值!
#include "stdio.h"
void f()
{
int a =0;//自动局部变量
static int c;//静态局部变量
a++;c++;
printf("%d,%d,",a,c)
}
void main()
{
int k;
for(k=1;k<=4;k++)
f();
}
输出结果:1,1,1,2,1,3,1,4
解析:
由于a时自动变量,即为动态生存期变量,所以每次调用函数f()时都要进行初始化,故每次输出都时1。
而b为静态局部变量,即为全局生存期变量,所以只是在第一次调用函数f()时进行初始化,在接下来函数f的调用中
b的值为上次函数结束时的值