5.4.2 变量的存储类别
在C语言中,变量和函数有两个属性:即数据类型和存储类别。变量的存储类别是指变量在内存中的存储方法。C语言系统将变量的存储类别分成了4种:自动变量(auto)、静态变量(static)、寄存器变量(register)和外部变量(extern)。
1.自动变量
①出现范围:出现在函数内部。
②判别方法:定义在函数内部并且缺省存储类别说明的变量或在直接用auto显式说明的变量。
③作用域:定义该变量的函数。
④生存期:定义该变量的函数被执行的期间。
前面所谈到的局部变量都是自动变量。
自动变量完整的定义形式如下:
auto 类型说明符 变量名;
注意:
①自动变量一般都会省略auto,函数中的大多数变量都是自动变量。例如:
②形参和复合语句里定义的变量是自动变量。
③自动变量一旦被定义说明,则只能在说明该变量的函数或复合语句中才有效,离开了上述区域则无效。
④自动变量的生存期只限于相应函数或复合语句被执行的过程,若变量是定义在复合语句内,则其生存期为该复合语句被执行的期间。
例5.17
程序如下:
程序运行结果如下:
例5.18
程序如下:
程序运行结果如下:
2.静态变量(static变量)
静态变量分成静态局部变量和静态全局变量。
静态变量的定义形式如下:
static 类型说明符 变量名
(1)静态局部变量。
①出现范围:可以出现在函数内部。
②判别方法:定义在函数内部,并且用static显式说明。
③作用域:定义该变量的函数。
④生存期:整个程序的执行期。
例5.19 用静态变量编程,求1~5的阶乘。
程序如下:
程序运行结果如下:
程序中static int f=1;定义f为静态局部变量,在第一次调用fac函数时,系统对fac函数中的f变量初始化,此时f=1,第一次调用结束时f的值仍为1,调用结束后,由于f是静态变量,它的存储单元不会被释放掉,第二次再调用fac函数时f的值是上一次调用的结果f=1,第二次调用结束后f=2,第三次调用时f=2,调用结束后f=6,依次继续下去,如表5-1所示。
表5-1
注意:
①静态局部变量的作用域在定义该变量的函数内,生存期是整个程序的执行期。要改变该变量的值,必须在定义该变量的函数内部完成,相对于外部变量而言,静态变量更安全,起到了信息屏蔽的作用,因此,静态局部变量的应用比较广泛。
②静态变量初始化语句只在第一次调用该函数时才执行,以后每次调用该函数不再执行初始化语句。
③静态变量如果没有初始化,则系统自动赋初值0或Null。
例5.20
程序如下:
程序运行结果如下:
(2)静态全局变量。
①出现范围:一般出现在函数的外部。
②判别方法:定义在函数外部,并且用static显式说明。
③作用域:从定义该变量的位置直至本源文件结束。
④生存期:整个程序的执行期。
在程序设计中希望某些外部变量只限于被本文件引用,而不能被其他文件引用,这时可以使用静态全局变量。
例5.21
3.寄存器变量(register变量)
①出现范围:出现在函数内部。
②判别方法:定义在函数内部的变量,并且用register显式说明。
③作用域:在定义该变量的函数内。
④生存期:定义该变量的函数被执行的过程。
寄存器变量不是存放在内存里,而是存放在CPU的寄存器里,其特点是存取速度快,如果变量存取很频繁,比如循环变量,则可以定义成寄存器变量以提高程序的执行速度。
寄存器变量的定义形式如下:
register 类型说明符 变量名
注意:
①只有自动变量和函数的形参可以作为寄存器变量。
②静态变量和外部变量不能定义为寄存器变量。
例5.22
程序如下:
程序运行结果如下:
4.外部变量(extern变量)
①出现范围:可以出现在程序中的任何说明部分。
②判别方法:定义在函数外部且无其他显式存储类别说明或直接用extern显式说明。
③作用域:从定义该变量的位置起直到本文件结束。
④生存期:整个程序的执行期。
例5.23
程序如下:
程序运行结果如下:
外部变量是全局变量,前面已经作了详细的介绍,这里不再重复,但有一点必须强调:变量应先定义后使用,但C语言允许外部变量先使用后定义(使用在前,定义在后),但必须在使用之前对该变量进行说明。
外部变量说明的一般形式如下:
extern 类型说明符 变量名;
外部变量的定义和说明是不同的。定义外部变量时系统会为该变量分配存储空间,并且变量的定义只有一次;说明外部变量时系统是不会为它分配存储空间的,并且同一个变量的说明可以出现在多个地方。“说明”的作用只是声明该变量是一个已在后面定义过的外部变量,因为要提前引用所以作说明;外部变量只能在函数外定义,而外部变量的说明可以在函数外部,也可以在函数内部。
例5.24
程序如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。