7.7 变量的存储类别、作用域及生存期
1.变量的存储类别
在C语言中,有两类存储类别:自动类别及静态类别。
有4个与两种存储类别有关的说明符:auto(自动)、register(寄存器)、static(静态)和extern(外部),这些说明符一般与类型说明一起出现,一般放在类型名的左边,例如:
auto long I,j;
也可写成:
long auto I,j;
(1)自动变量:自动变量是C程序中使用最多的一种变量,这种变量的建立和撤消都是在系统中自动进行的。
格式:[auto]数据类型 变量名[=初始化表达式],…;
上面的说明格式中,方括号中是可省略的部分,auto为自动类别标识符,若省略auto,系统缺省的存储类别也为自动类别。
注意:函数的形参也为自动类别,在定义时不必加存储类别标识符。
(2)寄存器变量:寄存器变量与自动变量的性质相同,其区别只在于存储的位置不同,寄存器变量存储在CPU的寄存器中,而自动变量存储在内存中的动态存储区,寄存器变量的存取速度要快些。
格式:register数据类型,变量名[=初始化表达式],…;
上面的说明格式中,register为寄存器变量的存储类别标识符。
说明:
①CPU中寄存器的数目是有限的,因此只能把少数的变量说明为寄存器变量;
②寄存器变量是存放在寄存器中的,而不是存放于内存中,所以,寄存器变量无地址;
③寄存器变量的说明应尽量放在靠近要使用的地方,用完后尽快释放,这样可提高使用效率。
(3)静态变量:静态类别变量的存储空间在程序的整个运行期间是固定的。
格式:static数据类型 变量名[=初始化表达式],…;
在上面的说明格式中,static为静态变量的存储类别标识符。
静态变量的初始化在编译时进行,定义时可用常量或表达式进行显式初始化。对于没有初始化的静态变量,自动初始化为0(整型)或0.0(实型)。
注意:静态变量具有可继承性,这与自动变量有所不同。
(4)外部变量:使用extern可使外部变量使用范围扩充到需要使用它的函数。外部变量可作显式的初始化,若不作初始化,系统将自动地初始化为0或0.0。
格式:[extern]数据类型,变量名[=初始化表达式],…;
上面的说明格式中,extern使外部变量的作用范围扩大到其他源程序文件中。
注意:局部变量既可以说明为自动类别,也可以说明为静态类别;全局变量只能说明为静态类别。
2.变量的作用域及生存期
在C语言中,变量必须先说明后使用,在程序中一个已定义的变量的使用范围就是此变量的作用域。经过赋值的变量在程序运行期间能保持其值的时间范围为该变量的生存期。
(1)局部变量的使用域及生存期
①自动变量的使用域及生存期
自动变量的存储单元被分配在内存的动态存储区,每当进函数体(或复合语句)时,系统自动为自动变量分配存储单元,退出时自动释放这些存储单元。自动变量的作用域为从定义的位置起,到函数体(或复合语句)结束为止。
自动变量在进入到定义它们的函数体(或复合语句)时生成,在退出所在的函数体(或复合语句)时消失,这就是自动变量的生存期。
使用自动变量的优点是使各函数之间造成信息分隔,不同函数中使用同名变量时不会相互影响。
②寄存器变量的使用域及生存期
寄存器变量的使用域及生存期与自动变量相同。
③静态存储类别的局部变量
在函数体(或复合语句)内部,用static说明的变量静态存储类别的局部变量,这种变量的作用域与自动(或寄存器)变量的作用域相同,但是生存期有所不同。
在整个程序运行期间,静态局部变量在内存的静态存储区中占据着永久的存储单元,甚至在退出函数后下次再进入函数时,静态局部变量仍使用原来的存储单元。由于不释放存储单元,所以这些存储单元中的值将会被保留下来。静态局部变量的生存期将一直延长到程序运行结束。
静态局部变量适合于在函数调用之间必须保留局部变量值的独立变量。
(2)全局变量的作用域及生存期
全局变量的作用域为从变量定义的位置开始,到整个源程序文件结束为止。生存期为整个程序的运行期间。
注意:全局变量在整个程序运行期间都占用内存空间。全局变量必须在函数以外定义,因而降低了函数的通用性,影响函数的独立性。使用全局变量时,当全局变量的值意外改变时,会引起副作用,这种错误一般难以查找。
①在同一编译单位内用extern标识符来扩展全局变量的作用域
当全局变量定义后,在引用函数前,应在引用它的函数中用extern对此全局变量进行说明,以便使编辑程序确定此外部变量已被定义,不必再为它分配存储单元,此时的作用域从extern说明开始,到此函数结束。
注意:全局变量的定义只能出现一次,这时不可使用extern标识符。如果多次引用全局变量,这时必须用extern标识符。
②在不同编译单位内用extern标识符来扩展全局变量的作用域
C语言中的不同函数可以存放在不同的源程序文件中,每个源程序文件可以单独进行编译,进行语法检查,再生成目标文件,最后用系统提供的连接程序把多个目标文件连接成一个可执行程序。
当程序由多个源程序文件组成时,若每个文件中都要引用同一个全局变量,这时如在每个源程序文件中都定义一个所需的同名全局变量,将在连接时产生重复定义错误。解决的办法是在其中一个源程序文件中定义所有全局变量,而在其他用到全局变量的源程序文件中用extern对这些变量进行说明,以表明它们已在其他编译单元中被定义。
③静态全局变量
当用static标识符说明全局变量时,全局变量为静态全局变量。静态全局变量只能在定义它的源程序文件中使用,不能被其他源程序文件使用。
2017年计算机二级C语言字考点归纳:变量的存储类别、作用域及生存期.doc正在阅读:
2017年计算机二级C语言字考点归纳:变量的存储类别、作用域及生存期10-24
军训决心书400字_决心书400字02-20
我的自画像作文600字女生(通用3篇)05-10
2018安徽宿州市埇桥区事业单位招聘公告【109人】05-13
2017年重庆高考两大加分照顾政策取消12-01
2022年3-4月北京普通话报名时间、条件及入口【3普通话考试7日起】05-05
海南2019年上半年中级银行从业准考证打印入口已开通【5月27日-6月2日】03-30
[2019年中考成绩查询网址]江苏南京2019中考成绩查询网址:http://edu.nanjing.gov.cn11-15
2017年下半年陕西中小学教师资格证成绩查询时间:12月12日起02-13