首页 理论教育 C语言变量作用域和生存期实践技巧

C语言变量作用域和生存期实践技巧

时间:2023-11-01 理论教育 版权反馈
【摘要】:在变量作用域内,可以对其进行存取。局部变量的作用域与生存期①auto变量函数中的局部变量,如果不专门声明为static存储类别,都是动态地分配存储空间的。全局变量的作用域与生存期①全局变量的作用域与生存期由于全局变量是在所有函数的外部任意位置定义的,所以其作用域是从其定义的位置开始一直到整个源程序文件结束为止。全局变量的生存期是整个程序的运行期间。

C语言变量作用域和生存期实践技巧

1.变量作用域

变量的有效范围称为变量作用域。在变量作用域内,可以对其进行存取。按变量作用域,将变量分为全局变量和局部变量

(1)全局变量

在C语言中,程序的编译单位是程序文件,一个源文件可以包含一个或多个函数。在所有函数外部定义的变量称为外部变量,也是全局变量。全局变量可以为源文件中其他函数所共用,其作用域是从定义位置到所在源文件结束。

全局变量的作用是增加函数间数据联系的渠道。

可以利用全局变量在函数间传递数据。当一个函数改变了该全局变量的值时,那么其他函数内部的同名全局变量值,也将随之改变。

(2)局部变量

在一个函数内部定义的变量称为局部变量。它只在本函数内有效,也就是说只有在本函数内才能使用它们。在此函数之外不能使用。

在函数内部复合语句内定义的变量都是局部变量,只在本复合语句中有效。

函数的形参是局部变量,只在本函数内有效。

不同函数中可以使用相同名字的局部变量,它们代表不同的对象,在内存中存储的位置也不同,互不干扰。

如果在一个源文件中全局变量和局部变量同名,则在局部变量的作用范围内,全局变量不起作用,而局部变量起作用。

2.变量生存期

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

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

① auto变量

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

例如:

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

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

② register变量

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

例如:

下面是使用寄存器变量来实现求阶乘功能的函数。(www.xing528.com)

说明:

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

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

③ 静态存储类的局部变量

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

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

说明:

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

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

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

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

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

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

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

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

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

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

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

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

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

④ 静态全局变量

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

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

我要反馈