书目《C程序设计(第三版)》
C语言中的变量和函数都有两个属性:数据类型和数据的存储类别,通过数据类型可以获知变量占用内存的大小,通过数据的存储类别可以获知变量占用内存的区域和时间。
-
(一)局部变量和外部变量的定义
1、函数内部定义的变量只在本函数范围有效,称为局部变量,形式参数也是局部变量,在程序块(例如if分支)中定义的变量只在程序块中有效;
2、函数之外定义的变量称为外部变量,外部变量是全局变量,它的有效范围是定义变量的位置开始到本源文件结束,如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”。 -
(二)存储区和存储方式
1、 内存中供用户使用的存储空间分为程序区、静态存储区(全局变量)、动态存储区(函数形式参数、未加static声明的局部变量、函数调用时的现场保护和返回地址等)。
2、静态存储方式是指在程序运行期间由系统(在静态存储区)分配固定的存储空间的方式;
3、动态存储方式是指在程序运行期间根据需要(在动态存储区)进行动态的分配存储空间的方式。 -
(三)4个重要关键字
1、auto(自动的):
用auto声明的局部变量称为自动变量,其存储空间自动分配和释放。该关键字可以省略,没有指明存储类别的,隐含确定为auto类别。
2、static(静态的):
A、如果希望局部变量的值在函数调用结束后不消失,并在下一次函数调用时继续使用,可以用static声明该局部变量。静态局部变量仅在编译时赋一次初值(如果定义时没有赋初值,编译时会自动赋值0或者空字符),函数调用结束后该变量仍然存在,但是其他函数并不能引用它。
B、如果希望某些外部变量只限于被本文件引用,可以用static声明该外部变量。
3、register(寄存器的):
如果一些变量使用频繁,C语言允许将局部变量的值放在CPU的寄存器中,这样可以提高执行效率,此时用register声明该局部变量。
只有局部自动变量和形式参数可以作为寄存器变量。
4、extern(外部的):
用extern来声明外部变量,可以扩展外部变量的作用域,通常在外部变量定义之前或者另外的源文件中进行声明。 -
(四)关于变量的声明和定义
声明时需要建立存储空间的(如int a),称为定义性声明,不需要建立存储空间的(如extern a)称为引用性声明,所以就广义的声明包括定义,而狭义的声明和定义就是引用性声明和定义性声明,下面所述均为狭义的:
1、外部变量只能定义一次(并且只能在定义时初始化),但是可以声明多次;
2、extern只能用于声明,不能用作定义;
3、用auto、static、register声明变量时,应与该变量的定义同时进行。 -
(五)小结
1、从作用域(空间)的角度分,有局部变量(自动变量,静态局部变量、寄存器变量)和外部变量(静态外部变量、普通外部变量);
2、从生存期(时间)来分,有动态存储变量(自动变量,寄存器变量)和静态存储变量(静态局部变量、静态外部变量、普通外部变量);
3、从变量存放的位置来分,有动态存储区(自动变量)、静态存储区(静态局部变量、静态外部变量、普通外部变量)和CPU中的寄存器(寄存器变量)。