变量的存储方式和生存期

在C语言中,每一个变量和函数都有两个属性:数据类型和数据的存储类别。

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

从变量值存在的时间(即生存期)来观察,变量的存储方式分为静态存储方式和动态存储方式。

C的存储类别包括4种:自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern)。根据变量的存储类别,可以知道变量的作用域和生存期。

1、自动变量(auto变量)

函数中的局部变量,如果不专门声明为static(静态)存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。在调用该函数时,系统会给这些变量分配存储空间,在函数调用结束时就自动释放这些存储空间。因此这类局部变量称为自动变量。用关键字auto作存储类别的声明。(关键字“auto”可以省略不写)。

2、静态局部变量(static局部变量)

用static声明一个变量的作用时:

①对局部变量:把它分配在静态存储区,该变量在整个程序执行期间不释放,其所分配的空间始终存在。(不赋初始值时自动赋为0或空字符‘\0’,而auto不会,因为每一次调用函数,auto修饰变量存储单元会变。)

②对全局变量:则该变量的作用域只限于本文件模块(即被声明的文件中,不会被extern)。

3、寄存器变量(register变量)

寄存器变量,用关键字register作声明。将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存中去存取。由于对寄存器的存取速度远高于对内存的存取速度,因此这样做可以提高效率。(如果想每次都从内存中读取变量的数据,可用volatile修饰。)

4、全局变量

全局变量都是存放在静态存储区中的。它的生存期存在于程序的整个运行过程。它的作用域是从变量的定义处开始,到本程序文件的末尾。

拓展外部变量的作用域:extern

①在一个文件内扩展外部变量的作用域

②将外部变量的作用域扩展到其他文件

在编译时遇到extern时,先在本文件中找外部变量的定义,如果找到,就在本文件中扩展作用域;如果找不到,就在连接时从其他文件中找外部变量的定义。如果找到,则扩展到本文件,否则,报错。

你可能感兴趣的:(c语言基础篇)