首页 理论教育 C语言程序设计教程:变量生存期简介

C语言程序设计教程:变量生存期简介

时间:2023-10-27 理论教育 版权反馈
【摘要】:变量的存在时间,称为变量生存期。函数中的局部变量,如果不专门声明为static存储类别,都是动态地分配存储空间的。为了提高效率,可以将局部变量存放在CPU中的寄存器中,称这样的变量为寄存器变量,用关键字register声明。静态存储类的局部变量。全局变量的生存期是整个程序的运行期间。在该函数内,访问的是局部变量,与同名的全局变量不发生任何关系。当用static说明全局变量时,称此变量为静态全局变量。

C语言程序设计教程:变量生存期简介

变量的存在时间,称为变量生存期。

1.局部变量作用域与生存期

(1)auto变量。

函数中的局部变量,如果不专门声明为static存储类别,都是动态地分配存储空间的。在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动地释放这些存储空间,数据存储在动态存储区中。这类局部变量称为自动变量。自动变量用关键字auto作存储类别的声明。

例如:

这里x和y是形参,z是自动变量,其初始值为8。执行完函数adv后,自动释放x、y、z所占的存储单元

另外,关键字auto可以省略,不写auto时隐含定义为自动存储类型。

(2)register变量。

为了提高效率,可以将局部变量存放在CPU中的寄存器中,称这样的变量为寄存器变量,用关键字register声明。

例如:

下面是使用寄存器变量来实现求阶乘功能的函数。

说明:

①只有自动变量和形式参数才可以声明为寄存器变量,静态局部变量不能声明为寄存器变量。

②因为一个计算机系统中的寄存器数量有限,所以不能定义任意多个寄存器变量。

(3)静态存储类的局部变量。

如果局部变量的值在函数调用结束后不消失而保留原值,就需要将这样的局部变量声明为静态局部变量,用关键字static进行声明。

例如:用下面程序段来说明静态局部变量的使用。

在这段程序中,因为z被定义为静态变量,所以在调用fun函数后z的改变并不被释放。z的值会被带入下一次函数fun的调用中。即第一次调用时z=1,第二次调用z=4,第三次调用z=5。y为自动变量,每次调用后会释放存储空间,所以每次调用y的值均为0。(www.xing528.com)

说明:

①静态局部变量属于静态存储类别,在整个程序运行期间都不释放;动态局部变量属于动态存储类别,只在其定义的函数内有效,函数调用结束时就被释放,其值不保存。

②静态局部变量在编译时赋初值,即只赋初值一次;动态局部变量每调用一次函数就重新赋初值一次。

③如果在定义静态局部变量时不赋初值,则编译系统对静态数值型局部变量自动赋0值,对静态字符型局部变量自动赋空值;如果在定义动态局部变量时不赋初值,则编译系统视动态局部变量的值是一个不确定的值。

2.全局变量的作用域与生存期

(1)全局变量的作用域与生存期。

由于全局变量是在所有函数的外部任意位置定义的,所以其作用域是从其定义的位置开始一直到整个源程序文件结束为止。

全局变量的使用相当于为函数之间的数据传递另外开辟了一条通道。

全局变量的生存期是整个程序的运行期间。

若全局变量和某个函数中的局部变量同名,在该函数中,此全局变量被屏蔽。在该函数内,访问的是局部变量,与同名的全局变量不发生任何关系。

(2)在同一编译单位内用extern说明符扩展全局变量的作用域。

如果全局变量定义在后,而引用它的函数在前时,应该在引用它的函数内部用extern对此全局变量进行说明,以便通知编译程序:该变量是一个已在函数外部定义的全局变量,已经分配了存储单元,不需要再为它另外开辟存储单元。这时,作用域从extern说明处开始,延伸到该函数末尾。

(3)在不同编译单位内用extern说明符扩展全局变量的作用域。

当一个程序由多个编译单位组成,并且在每个文件中均需要引用同一全局变量,这时若在每个文件中都定义了一个所需要的同名全局变量,则在连接时将会产生重复定义错误。在这种情况下,单独编译每个文件时无异常,编译程序将按定义分别为它们开辟存储空间,而当进行连接时,就会显示出错信息,指出同一个变量名进行了重复定义。解决的办法是:在其中的一个文件中定义所有的全局变量,而在其他用到这些全局变量的文件中用extern对这些变量进行说明,声明这些变量已在其他编译单位中定义,通知编译程序不必为它们开辟存储单元。

(4)静态全局变量。

当用static说明全局变量时,称此变量为静态全局变量。静态全局变量仅限于在本编译单位使用,不能被其他编译单位所引用。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈