存储类定义C程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面介绍C程序中可用的存储类。
auto称为自动变量。
{
intmount;
autointmonth;
}
上面的实例定义了两个带有相同存储类的变量,auto只能用在函数内,即auto只能修饰局部变量。
局部变量是指在函数内部说明的变量(有时也称为自动变量)。用关键字auto进行说明,当auto省略时,所有的非全程变量都被认为是局部变量,所以auto实际上从来不用。
局部变量在函数调用时自动产生,但不会自动初始化,随函数调用的结束,这个变量也就自动消失了,下次调用此函数时再自动产生,还要再赋值,退出时又自动消失。
static称为静态变量。根据变量的类型可以分为静态局部变量和静态全程变量。
1.静态局部变量
它与局部变量的区别在于:在函数退出时,这个变量始终存在,但不能被其它函数使用,当再次进入该函数时,将保存上次的结果。其它与局部变量一样。
2.静态全程变量
TurboC2.0允许将大型程序分成若干独立模块文件分别编译,然后将所有模块的目标文件连接在一起,从而提高编译速度,同时也便于软件的管理和维护。静态全程变量就是指只在定义它的源文件中可见而在其它源文件中不可见的变量。它与全程变量的区别是:全程变量可以再说明为外部变(extern),被其它源文件使用,而静态全程变量却不能再被说明为外部的,即只能被所在的源文件使用。
static存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用static修饰局部变量可以在函数调用之间保持局部变量的值。
以下实例演示了static修饰全局变量和局部变量的应用:
实例
实例中count作为全局变量可以在函数内使用,thingy使用static修饰后,不会在每次调用时重置。
可能您现在还无法理解这个实例,因为我已经使用了函数和全局变量,这两个概念目前为止还没进行讲解。即使您现在不能完全理解,也没有关系,后续的章节我们会详细讲解。当上面的代码被编译和执行时,它会产生下列结果:
thingy为6,count为9
thingy为7,count为8
thingy为8,count为7
thingy为9,count为6
thingy为10,count为5
thingy为11,count为4
thingy为12,count为3
thingy为13,count为2
thingy为14,count为1
thingy为15,count为0
extern称为外部变量。为了使变量除了在定义它的源文件中可以使用外,还要被其它文件使用。因此,必须将全程变量通知每一个程序模块文件,此时可用extern来说明。
当您使用extern时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
extern修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候,如下所示:
第一个文件:main.c
#include
第二个文件:support.c
#include
$gccmain.csupport.c
这会产生a.out可执行程序,当程序被执行时,它会产生下列结果:
countis5
register称为寄存器变量。它只能用于整型和字符型变量。定义符register说明的变量被TurboC2.0存储在CPU的寄存器中,而不是象普通的变量那样存储在内存中,这样可以提高运算速度。但是TurboC2.0只允许同时定义两个寄存器变量,一旦超过两个,编译程序会自动地将超过限制数目的寄存器变量当作非寄存器变量来处理。因此,寄存器变量常用在同一变量名频繁出现的地方。
register存储类用于定义存储在寄存器中而不是RAM中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的'&'运算符(因为它没有内存位置)。
registerintmiles;
寄存器只用于需要快速访问的变量,比如计数器。还应注意的是,定义'register'并不意味着变量将被存储在寄存器中,它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制。
另外,寄存器变量只适用于局部变量和函数的形式参数,它属于auto型变量,因此,不能用作全程变量。定义一个整型寄存器变量可写成:registerinta;