C语言中变量的存储类别
从变量的作用域角度(空间)来分,可以分为全局变量和局部变量。
从变量的存在时间角度(生存期)来分,可以分为静态存储方式和动态存储方式。
内存中供用户使用的存储空间分为三部分:程序区、静态存储区、动态存储区。
数据分别存放在静态存储区和动态存储区中。
全局变量全部存放在静态存储区[d1] 中,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。程序执行过程中它们占据固定的存储单元,而不是动态分配和释放。
而在动态存储区中存放以下数据:
1.函数形式参数;
2.自动变量;
3.函数调用时的现场保存和返回地址。
数据在内存中的存储方法两类:静态存储类和动态存储类。
具体包含四种:
自动的(auto),
静态的(static),
寄存器的(register),
外部的(extern)。
auto : 函数中的局部变量称为自动变量。
static : 静态变量属于静态存储类别,在静态存储区内分配存储单元。在程序运行期间不释放。静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。若定义时不赋初值,编译时自动赋初值[d2] ;而对自动变量[d3] ,如果不赋初值则它的值是不确定的。
虽然静态局部变量在函数调用后依然存在,但其它函数是不能引用它的。
以下情况适合用静态局部变量:
1.需要保留函数上一次调用结束时的值。
2.如果初始化后,变量只被引用而不改变其值,则这时用静态局部变量比较方便,以免每次调用时重新赋值。
register : 寄存器变量是为了提高效率。因为寄存器的存取速度远高于内存的存取速度。
注意:
1.只有局部自动变量和形式参数可以作为寄存器变量。
2.不能定义任意多个寄存器变量,因为计算机系统中寄存器数目有限。
3.局部静态变量不能定义为寄存器变量,一个变量只能声明为一个存储类别。
extern : 外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量的定义处开始,到本程序的末尾。编译时将外部变量分配在静态存储区。
如果想在定义点之前引用外部变量,可以声明为extern以扩展作用域。用extern声明外部变量时,类型名可以省略。
在一个文件file1中定义了外部变量,而想在另一个文件file2中引用它,可以在另一个文件file2中对此外部变量进行extern声明。这样两个文件都可以引用这个外部变量。这是用extern将外部变量作用域扩展到其它文件中。
如果想使一个外部变量只在一个文件中使用,而不能被其它文件引用,可以在定义外部变量时加一个static声明[d4] 。这种只能用于本文件的外部变量(全局变量)成为静态外部变量。
声明部分出现的变量有两种情况:
一是需要建立存储空间的,称为定义性声明(如int a;);
二是不需要建立存储空间的,称为引用性声明(如extern a;)。
外部变量只能由一次定义,但可以多次声明。
用static声明一个变量的作用有二:1.对局部变量用static声明,则为该变量分配的空间在整个程序执行期间始终存在;2.全局变量用static声明,则该变量的作用域只限于本文件。
内部函数:如果一个函数只能被本文件中其它函数所调用,它称为内部函数[d5] 。形如:static 类型标识符 函数名(形参表)
外部函数:如果此函数可以被其它文件调用,称为外部函数,
形如:extern 类型标识符 函数名(形参表)。在需要调用此函数的文件中,用extern声明所调函数是外部函数,形如:extern 函数名(实参表)。
全局变量由编译器建立且存放在内存的全局数据区,局部变量存放在栈区.