C程序中全局变量的作用范围

标签:
杂谈 |
分类: C |
程序的编译单位是源程序文件,一个源文件可以包含一个或若干个函数。在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。如:
http://c.longziyong.cn/images/2011/%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F1.jpg
p、q、c1、c2都是全局变量,但它们的作用范围不同,在main函数和f2函数中可以使用全局变量p、q、c1、c2,但在函数f1中只能使用全局变量p、q,而不能使用c1和c2。
在一个函数中既可以使用本函数中的局部变量,又可以使用有效的全局变量。
说明:
(1)设全局变量的作用是增加了函数间数据联系的渠道。由于同一文件中的所有函数都能引用全局变量的值,因此如果在一个函数中改变了全局变量的值,就能影响到其他函数,相当于各个函数间有直接的传递通道。由于函数的调用只能带回一个返回值,因此有时可以利用全局变量增加与函数联系的渠道,从函数得到一个以上的返回值。
为了便于区别全局变量和局部变量,在C程序设计人员中有一个不成文的约定(但非规定),将全局变量名的第一个字母用大写表示。
例1 有一个一维数组,内放10个学生成绩,写一个函数,求出平均分,最高分和最低分。
显然希望从函数得到3个结果值,除了可得到一个函数的返回值以外,还可以利用全局变量。
-
float
Max=0,Min=0; -
-
-
float
average( floatarray[], intn){ -
int i; -
float aver,sum=array[0]; -
Max=Min=array[0]; -
for(i=1;i<n;i++){ -
if(array[i]>Max) Max=array[i]; -
else if(array[i]<Min) Min=array[i]; -
sum=sum+array[i]; -
} -
aver=sum/n; -
return(aver); -
}
-
-
void
main(){ -
float ave,score[10]; -
int i; -
for(i=0;i<10;i++) scanf( "%f",&score[i]); -
ave=average(score,10); -
printf("max=%.2f\nmin=%.2f\naverage=%.2f\n",Max,Min,ave); -
getch(); -
}
运行情况如下:
99 45 78 97 100 67.5 89 92 66 43
max=100.00
min=43.00
average=77.65
http://c.longziyong.cn/images/2011/%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F2.jpg函数average中与外界有联系的变量与外界的联系如右图所示。可以看出形参array和n的值由main函数传递给形参,函数average中aver的值通过return语句带回main函数。Max和Min是全局变量,是公用的,它们的值可以供各函数使用,如果在一个函数中,改变了它们的值,在其他函数中也可以使用这个已改变的值。
由此看出,可以利用全局变量以减少函数实参与形参的个数,从而减少内存空间以及传递数据时的时间消耗。
(2)建议不在必要时不要使用全局变量,因为:
① 全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。
② 它使函数的通用性降低了,因为函数在执行时要依赖于其所在的外部变量。如果将一个函数移到另一个文件中,还要将有关的外部变量及其值一起移过去。但若该外部变量与其他文件的变量同名时,就会出现问题,降低了程序的可靠性和通用性。在程序设计中,在划分模块时要求模块的“内聚性”强、与其他模块的“耦合性”弱。即模块的功能要单一(不要把许多互不相干的功能放到一个模块中),与其他模块的相互影响要尽量少,而用全局变量是不符合这个原则的。一般要求把C程序中的函数做成一个封闭体,除了可以通过“实参——形参”的渠道与外界发生联系外,没有其他渠道。这样的程序移植性好,可读性强。
③ 使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬时各个外部变量的值。在各个函数执行时都可能改变外部变量的值,程序容易出错。因此,要限制使用全局变量。
(3)如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。如:
例2 外部变量与局部变量同名。
http://c.longziyong.cn/images/2011/%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F3.jpg
运行结果为
8
程序中第1行定义了外部变量a、b,并使之初始化。第3行开始定义函数max,a和b是形参,形参也是局部变量。函数max中的a、b不是外部变量a、b,它们的值是由实参传给形参的,外部变量a、b在max函数范围内不起作用。最后4行是main函数,它定义了一个局部变量a,因此全局变量a在main函数范围内不起作用,而全局变量b在此范围内有效。因此printf函数中的max(a,b)相当于max(8,5),程序运行后得到结果为8。