从生存期(即值存在的时间)的角度来分,变量可以分为静态存储变量和动态存储变量。
存储类别是根据数据被存放的位置不同而进行的分类。C语言中,有的变量可以存入在CPU的通用寄存器中,而多数数据被存放在内存中。内存又分为静态存储区和动态存储区两种。静态存储区存放的变量为静态存储变量,它们在程序运行期间被分配到固定的存储空间中,运行结束前始终占据内存。动态存储区存放的是动态存储变量,它们在程序运行期间根据需要被动态地分配到存储空间中,一旦离开作用域,所占内存即被释放。
在C语言中每一个变量都有两个属性:数据类型和存储类型。C语言支持四种存储类别:自动的(auto)、静态的(static)、寄存器的(register)和外部的(extern)。这些说明符告诉编译器如何存储相应的变量。
一般定义方法:
存储类别数据类型变量名表;
例如:auto int a,b;
static float i;
register char c;等等。
1.auto自动变量
如不做专门的说明,函数中的局部变量都是动态分配存储空间的。它们存储在内存中动态存储区,分配和释放存储空间的工作是由编译系统自动处理的,因此这类局部变量称为自动变量。
定义形式为:
auto数据类型变量名表;
例如:
格式说明:
(1)自动变量的作用域是在定义它的函数体或分程序内,一旦退出了该函数体或分程序,则该变量就被释放。
(2)不同语句块中的auto变量可以同名,同名变量不会使用相同的内存单元。
(3)函数的形参具有自动变量的属性,但是不允许对形参使用auto关键字。
(4)当定义变量省略存储类别时,C编译系统默认存储类别为auto型。
2.static静态变量
static关键字修饰的变量称为静态变量。静态变量在静态存储区分配存储单元,在程序运行期间自始至终占用被分配的存储空间。
定义形式为:
static数据类型变量名表;
static型可定义全局变量和局部变量。
(1)静态局部变量。在函数体内用static说明的变量称为静态局部变量。在程序运行期间,它占据一个永久性的存储单元,在退出函数后,值仍旧保留。静态变量是在编译时赋初值,且只赋一次初值,因此在程序运行时其初值已经确定,以后调用函数时不再赋初值,而是连续保留上一次函数调用时的结果。若不给静态局部变量赋初值,则系统默认初值为0。
【例5-15】分析下列程序运行结果。
程序代码:
从两次程序的运行结果可以看出,自动变量在函数每次被调用时,都进行初始化。而静态变量只在编译阶段初始化一次,且能在保留上一次函数值的基础上进行改变。
【例5-16】输出1到5的阶乘值。(www.xing528.com)
程序分析
因为求阶乘的值可以利用2!=2×1,而3!=3×2!,4!=3×3!,即每次调用求阶乘函数fac(),求出一个i!,同时保留这个i!的值以便下次再乘(i+1)得到(i+1)!,所以把这个求阶乘的变量定义成静态局部变量,以后在调用时不再重新赋值。
程序代码:
(2)静态全局变量。有时在程序设计中希望某些外部变量只限于本文件使用,而不能被其他文件引用。当定义一个全局变量时,若将其指定为static类别,则说明该全局变量只在本源程序文件中使用,其他源程序文件不能引用该全局变量。
例如:
在file1.c中定义了一个全局变量n,并用static声明,因此n只能用于本文件,虽然在file2.c文件中用了“extern n;”,但file2.c文件中无法使用file1.c中的全局变量n。
在程序设计中,常由若干个人分别完成各个模块,采用static声明,可以使每个人独立地在其设计的文件中使用相同的外部变量名而互不干扰,防止被其他文件误用。
对于全局变量,不管是否加static说明,均属于静态存储变量。使用static只是为了限制其引用范围。
3.register寄存器变量
用register关键字修饰的变量是寄存器变量。一般情况下,变量的值是存放在内存中的。如果某些要频繁使用的变量,如循环变量,为了提高变量的存取时间,可将这些变量存放在寄存器中,需要时直接从寄存器取出,而不必再到内存中去存取。
定义形式为:
register数据类型 变量名表;
格式说明:
(1)只有局部自动变量和形式参数可说明为寄存器变量。
(2)一个计算机系统中的寄存器数目是有限的。
(3)不同系统对register的处理不同。
当今的优化编译系统能够识别使用频繁的变量,从而自动地将这些变量放在寄存器中,而不需要编程者指定。因此,实际上用register声明变量是不必要的,大家对它有一定了解即可。
4.extern外部变量
extern关键字修饰的变量是外部变量。C语言允许单独编译一个程序的各个模块,然后链接起来,这样可以加速编译和管理大型的项目,所以必须提供一种方法让所有的文件了解程序所需要的全局变量。
例如,一个程序包含两个文件,在两个文件中都要用到同一个外部变量n,这时不能分别在两个文件中各自定义一个外部变量n,否则在进行程序的链接时会出现“重复定义”的错误。正确的方法是:在任意一个文件中定义外部变量n,而在另一文件中用extern对n做“外部变量声明”。在编译和链接时,系统会由此知道n是一个已在别处定义的外部变量,并将在另一文件中定义的外部变量的作用域扩展到本文件,在本文件中就可以合法地引用外部变量n。因此,当在一个文件中要引用另一个文件中的全局变量或在全局变量定义之前要引用它时,必须用extern对该变量进行外部说明,这相当于扩大全局变量的作用域。
外部变量说明形式为:
extern数据类型 变量名表;
【例5-17】分析下列程序。
【程序说明】
程序含两个源文件file1.c和file2.c。将这两个文件创建在同一个工程文件中。在file1.c中定义全局变量i初值为3。执行main()函数中i++;语句后,i为4。执行next()函数中i++;语句后,i为5。
file2.c中变量i做了外部说明,即引用file1.c中的变量i,值为5。执行other()函数中i++;语句后i值为6。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。