C语言的动态存储变量与静态存储变量

         

 动态存储变量与静态存储变量

    

  在C语言中,每一个变量都有3个属性:一是“数据类型”,如int、float、char等,它确定了变量存储长度和运算方式;二是“作用域”,如上节所述,由变量所处的位置确定变量是局部变量还是全局变量,从而确定变量的作用域;三是“存储类别”,即变量在内存中的存储方式,不同的存储方式决定了变量存在的时间,即生存期。

     

  静态存储的变量是指变量在程序执行的全过程中始终占据着大小固定的存储单元,直到程序运行结束才予以释放。而动态存储的变量是指变量的存储单元在程序运行过程中由系统动态地分配和回收,当定义它们的函数被调用时分配内存,当定义它们的函数返回时系统收回变量所占内存。在C语言中,变量在内存中的存储方式可分为两大类:静态存储和动态存储。具体包含4种:

         

 auto型存储(自动的);

              

 extern型存储(外部的);

 

static型存储(静态的);  

             

 register型存储(寄存器的)。

   

C语言对每一个变量定义的一般格式为:

    [存储类型] [数据类型]  变量名1,变量名2,……;

在定义变量时,存储类别和数据类型可以缺省一个,当存储类别缺省时,默认为auto型;当数据类型缺省时,默认为int型。

5.7.1 自动变量(auto型)

       

这种存储类型是C语言程序中使用最广泛的一种类型。C语言规定,函数内凡未加存储类型说明的变量均视为自动变量,也就是说自动变量可省去说明符auto。在前面各章的程序中所定义的变量凡未加存储类型说明符的都是自动变量。

       

自动变量具有以下特点:

(1)自动变量的作用域仅限于定义该变量的个体内。在函数中定义的自动变量,只在该函数内有效。在复合语句中定义的自动变量只在该复合语句中有效。

(2)自动变量属于动态存储方式,只有在使用它,即定义该变量的函数被调用时才给它分配存储单元,开始它的生存期。函数调用结束,释放存储单元,结束生存期。因此函数调用结束之后,自动变量的值不能保留。在复合语句中定义的自动变量,在退出复合语句后也不能再使用,否则将引起错误。

(3)由于自动变量的作用域和生存期都局限于定义它的个体内(函数或复合语句内),因此不同的个体中允许使用同名的变量而不会混淆。 即使在函数内定义的自动变量也可与该函数内部的复合语句中定义的自动变量同名。

5.7.2 外部变量(extern型)

      

外部变量(即全局变量)是指在函数的外部定义的变量,它的作用域为从变量的定义处开始,到本程序文件的末尾,属于静态存储类别。在一个源文件中,可以通过关键字extern来扩大外部变量的作用域。

[例5-12] 利用extern扩大外部变量的作用域。

 

 int max(int x,int y)

      {    int z

       

z=(x>y)? x:y;

     

 return z

       }

  main( )

     {  extern a,b;

       

printf("%d",max(a,b));

     }

        int a=13,b=14;

       

主函数中用extern声明外部变量a、b,从而使它们的作用域从主函数内扩大本程序最后一行。若没有用extern声明外部变量a、b的语句,那么在编译printf语句时将会出错。因为尽管在本程序最后一行定义变量a、b为外部变量,但它是在printf语句后定义的,它的作用域仅局限于最后一句语句。

5.7.3 静态变量(static型)

       

局部变量是动态存储的变量,但是可以用存储类型说明符static将其定义为静态存储的变量。即用关键字static声明的局部变量称为静态局部变量,当系统为其分配存储单元后便一直占据,直到程序运行结束才释放所占据的内存空间。

    C语言中,一个源程序可以由一个或多个源文件(文件扩展名为c的文件)组成。如果在定义全局变量(外部变量)时,在前面再冠以static,就构成了静态的全局变量,静态全局变量的作用域只局限于定义它的源文件内,源程序中其他源文件不能使用。而一个源文件中定义的非静态全局变量(没有在前面冠以static),在源程序包含的各个源文件中都可以使用,使用时在前面加上extern。

5.7.4 寄存器变量(register型)

      

上述各类变量使用时都存放在内存中,因此当对一个变量频繁读写时,必须要反复访问内存,从而花费大量的存取时间。为此,C语言提供了另一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写,这样可提高效率。寄存器变量的说明符是register。对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量。因为计算机系统中寄存器的数目是非常有限的,所以决定了在C语言程序中寄存器变量的数目有一定的限制。Turbo C允许同时定义两个寄存器变量,C语言编译系统会自动地将超过限制数目的寄存器变量当作自动变量进行处理。

5.8 内部函数和外部函数

    函数都是全局的,因为不能在函数内部定义另一个函数。但是,根据函数能否被其他源文件调用,将函数区分为内部函数和外部函数。

5.8.1 内部函数

    如果一个函数只能被本源文件中的其他函数所调用,它称为内部函数。在定义内部函数时,在函数名和函数类型前面加static,即:

       static 类型标识符 函数名(形参表) 

例如:static int f (int a,int b);

    使用内部函数,可以使函数只局限于所在文件,如果在不同的文件中有同名的内部函数,互不干扰。如果在别的源文件中要调用这个函数f( ),则被认为是非法的。

5.8.2 外部函数

     在定义函数时,如果冠以关键字extern,表示此函数是外部函数,外部函数在整个源程序中都有效,其定义的一般形式为:

       extern 类型说明符 函数名(形参表)

例如:extern int f (int a,int b);

如果在定义函数时省略 extern 或 static,则默认为外部函数。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值