首页 > 【转载】C语言变量详解

【转载】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的值为上次函数结束时的值

 

转载于:https://www.cnblogs.com/zen_chou/archive/2009/05/19/1460227.html

更多相关:

  • 多线程编程 mind-Mapping保存有一下导图的xmind文件,可直接获取 互斥变量 互斥对象 ptrhead相关接口 条件变量 future异步访问类 async类 promise类 package_task类...

  • 我们在实际开发的过程中,可能需要某些类的成员变量并不是针对每一个对象的,而是针对每一个类而言的,比如在银行中有一个利率数据,我们希望的是,当一个利率改变的时候,所有的对象都能够看到这个改变的数据,并利用它,而不是每一个对象都有一个利率成员变量。这个时候就设计到了静态成员变量。 一. 内存那些事 静态成员变量是存放在静态...

  • volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。在DSP开发中,经常需要等待某个事件的触...

  •   引子     阅读以下代码,并尝试分析 代码解析 在主线程中,线程Id为1,为线程变量赋值 变量==d6ff开启一个新的task,此时线程Id为4,变量==d6ff,并调用Task1开启一个同步Task3,线程Id为1。变量==d6ff,修改值==f598此时第二步启动的Task1运行,线程Id为4,变量==d6ff,修改值=...

  • 操作系统基础    操作系统是协调、控制、管理计算机硬件资源与软件资源的控制程序 为什么要用操作系统?    1.操作系统可以把复杂的操作简化给用户使用或者应用程序  2.可以让应用程序对计算机硬件竞争变的有序  一套完整的计算机分为:操作系统、应用程序、计算机硬件 编程语言的分类   机械语言:使用二进制让计算机工作   优点:运行...