C语言总结-----变量的存储方式和生存期

存储方式
 从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。

从变量值存在的时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式。
静态存储方式:是指在程序运行期间分配固定的存储空间的方式。
动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式。
 
数据存储类别
     根据数据存储过程和存储位置的不同,将C的存储类别分为4种:自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern)。根据变量的存储类别,可以知道变量的作用域和生存期。

  • 局部变量默认为auto型
  • register型变量个数受限,且不能为long, double, float型
  • 局部static变量具有全局寿命和局部可见性
  • 局部static变量具有可继承性(下次进入函数该值还存在)
  • extern不是变量定义,可扩展外部变量作用域

一、自动变量auto

函数中的局部变量,如不专门声明为 static 存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。

如函数中的形参和在函数中定义的变量,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。

这类局部变量称为自动变量。自动变量用关键字 auto 作存储类别的声明。

关键字 auto 可以省略, auto 不写则隐含定为“自动存储类别”,属于动态存储方式

二、静态局部变量static

有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为“静态局部变量”,用关键字 static 进行声明。
注意:

(1)静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储空间,函数调用结束后即释放。
(2) 静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
(3) 如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值 0 (对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。
 

三、寄存器变量register

     一般情况下,运算器到内存中存取变量,对于频繁使用的变量,可将局部变量放在 CPU 的寄存器中,运算器对寄存器的读取速度比内存快的多,因此大大提高了效率。这种变量叫“寄存器变量”,用关键字register 作声明。
 
说明:(1) 只有局部自动变量形式参数可以作为寄存器变量;
           (2) 一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量。

          (3)register变量只是向cpu提出申请,但不一定能申请成功。

四、外部变量extern(即全局变量)

  •  外部变量(即全局变量)是在函数的外部定义的
  • 它的作用域为从变量定义处开始,到本程序文件的末尾。
  • 如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字 extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。

1、在一个文件内扩展外部变量的作用域
2、将外部变量的作用域扩展到其他文件
     在任意一个文件中对变量进行定义,在另一个文件中用extern对该变量进行外部声明,就可以在本文件中使用其他文件的定义过的变量了。
注意:编译遇到extern时,先在本文件内找外部变量的定义,如果没有找到再到其他文件寻找该变量的定义。
3、将外部变量的作用域限制在本文件中
     由于一个任务可能由若干人完成,为了防止自己的文件变量被别人引用修改,在外部变量前加static,即将该变量限制在本文件中,其他文件将不能使用该变量。

  • 外部函数

     如果定义函数时在函数首部加上extern,该函数为外部函数,可供其他文件调用。当在定义函数时,省略extern,则默认为外部函数。(如例4)

猜你喜欢

转载自blog.csdn.net/lishasha5/article/details/83215235