购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.5.1 局部变量与全局变量

按照变量的有效作用范围可划分为局部变量和全局变量。局部变量是在一个函数内部定义的变量,该变量只在定义它的那个函数范围以内有效。在此函数之外局部变量即失去意义,因而也就不能使用这些变量了。不同的函数可以使用相同的局部变量名,由于它们的作用范围不同,不会相互干扰。函数的形式参数也属于局部变量。在一个函数内部的复合语句中也可以定义局部变量,该局部变量只在该复合语句中有效。

全局变量是在函数外部定义的变量,又称为外部变量。全局变量可以为多个函数共同使用,其有效作用范围是从它定义的位置开始到整个程序文件结束。如果全局变量定义在一个程序文件的开始处,则在整个程序文件范围内都可以使用它。如果一个全局变量不是在程序文件的开始处定义的,但又希望在它的定义点之前的函数中引用该变量,这时应在引用该变量的函数中用关键字extern将其说明为“外部变量”。另外,如果在一个程序模块文件中引用另一个程序模块文件中定义的变量时,也必须用extern进行说明。

外部变量说明与外部变量定义是不相同的。外部变量定义只能有一次,定义的位置在所有函数之外。而同一个程序文件中的外部变量说明可以有多次,说明的位置在需要引用该变量的函数之内。外部变量说明的作用只是声明该变量是一个已经在外部定义过了的变量而已。

如果在同一个程序文件中,全局变量与局部变量同名,则在局部变量的有效作用范围之内,全局变量不起作用。换句话说,局部变量的优先级比全局变量高。在编写C语言程序时,不是特别必要的地方一般不要使用全局变量,而应当尽可能地使用局部变量。这是因为局部变量只在使用它时,才为其分配内存单元,而全局变量在整个程序的执行过程中都要占用内存单元。另外,如果使用全局变量过多,在各个函数执行时都有可能改变全局变量的值,使人们难以清楚地判断出在各个程序执行点处全局变量的值,这样会降低程序的通用性和可读性。

还有一点需要说明,如果程序中的全局变量在定义时赋给了初值,按ANSI C标准规定,在程序进入main()函数之前必须先对该全局变量进行初始化。这是由链接定位器BL51对目标程序链接定位时,在最后生成的目标代码中自动加入一段运行库“INIT.OBJ”来实现的。由于增加了这么一段代码,程序的长度会增加,运行速度也会受到影响。因此要限制使用全局变量。

下面通过一个例子来说明局部变量与全局变量的区别。

例2-30 局部变量与全局变量的区别。

程序执行结果:

8

这个程序中故意使用了相同的变量名a和b,请读者仔细区别它们的作用范围。程序的第一行将a和b定义成全局变量并且赋了初值,由于具有初值的全局变量需要先行初始化,因此读者如果用dScope51对这个例子程序进行调试,可以看到程序在进入main()函数之前,除了要执行一段启动程序STARTUP的代码之外,还需要执行一段全局变量初始化程序INIT的代码。

第二行开始是定义一个求最大值函数max(),其作用是求得a和b中较大者的值。这里的a和b是max()函数的形式参数,属于局部变量。外部变量a和b在函数max()内部不起作用,即形式参数a和b的值不再是3和5,它们的值是通过主调函数中的实际参数传递过来的。

程序的最后四行是main()函数,在main()函数内部定义了一个局部变量a并赋值为8,全局变量a在这里不起作用,而全局变量b在此范围内有效。因此printf()函数中的max(a,b)相当于max(8,5),故程序的最后执行结果为8。 a0m2B9N/CPxMjhT9nKVR1t8Ks10ihVHSH2SARjnq+qCeMR4op5PzyQQaYC97Ahbd

点击中间区域
呼出菜单
上一章
目录
下一章
×