【转载】C语言变量详解

原链接: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的值为上次函数结束时的值

 

posted @ 2009-05-19 15:02  MyShowTime  阅读(398)  评论(0编辑  收藏  举报