目录
8.8局部变量和全局变量
局部变量
在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。这称为“局部变量”。例如:
float f1(int a)
{
int b,c;
//a、b、c只在这个函数体内有效
}
int main()
{
int m,n;
//m、n只在这个函数体内有效
}
注意:
-
不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。
-
形式参数也是局部变量。例如上面f1中的形参a,也只在f1函数中有效。其他函数可以调用f1函数,但是不能引用f1函数的形参a。
-
在一个函数内部,可以再复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也称为“分程序”或“程序块”。
int main()
{
int a,b; // a、b在此范围内有效 (在整个主函数内有效)
//....
{
int c;
c = a + b; //c在此范围内有效 (只在内部的中括号内有效)
//....
}
//... ...
}
变量c只在复合语句(分程序)内有效,离开该复合语句该变量就无效,释放内存。
全局变量
程序的编译单位是源程序文件,一个源文件可以包含一个或若干函数。在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可以为文本中其他函数所共用。它的有效范围从定义变量的位置开始到本源文件结束。例如:
int p = 1, q = 5; //外部变量 p、q的作用范围从这里开始到下面全部
float f1(int a) //定义函数f1
{
int b, c;
}
char c1, c2; //外部变量 c1、c2的作用范围从这里开始到下面全部
char f2(int x, int y) //定义函数f2
{
int i, j;
}
int main() //主函数
{
int m, n;
}
在一个函数中既可以使用本函数中的局部变量,也可以使用有效的全局变量。
说明:
(1)设置全局变量的作用是增加了函数间数据联系的渠道。由于同一文件中的所有函数都能引用全局变量的值,因此如果在一个函数中改变了全局变量的值,就能影响到其他函数,相当于各个函数间有直接的传递通道。由于函数只能带回一个返回值,因此有时利用全局变量增加函数间的联系渠道,通过函数调用能得到一个以上的值。
为了便于区别全局变量和局部变量,在C程序设计人员中有一个习惯(但非规定),将全局变量名的第一个字母用大写表示。
有一个一维数组,内放10个学生成绩,写一个函数,求平均分、最高分和最低分。
#include<stdio.h>
float Max = 0, Min = 0;
int main()
{
float average(float array[],int n);
float ave,score[10];
for(int i=0;i<10;i++)
{
scanf("%f",&score[i]);
}
ave = average(score,10);
printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",Max,Min,ave);
return 0;
}
float average(float array[],int n)
{
float aver,sum=array[0]; //把实参数组的首元素的地址传递给形参数组
Max = Min = array[0];
for(int i=1;i<n;i++) //注意这里从1开始
{
if(array[i]>Max) Max = array[i];
if(array[i]<Min) Min = array[i];
sum += array[i];
}
aver = sum/n;
return (aver);
}
//输入
99 45 78 97 100 67.5 89 92 66 43
//输出
max=100.00
min= 43.00
average= 77.65
Max和Min是全局变量,是公用的,它们的值可以供给各函数使用,如果在一个函数中,改变了它们的值,在其他函数中也可以使用这个已经改变的值。
由此可以看出,可以利用全局变量以减少函数实参与形参的个数,从而减少内存空间以及传递数据时的时间消耗。
(2)建议不在必要时不要使用全局变量,原因如下:
-
全局变量在程序的全部执行过程中都占用内存单元,而不是仅在需要时才开辟单元。
-
它使函数的通用性降低了,因为函数在执行时要依赖其所在的外部变量。如果将一个函数移到另一文件中,还要将有关的外部变量及其值一起移过去。但若该外部变量与其他的文件的变量同名时,就会出现问题,降低了程序的可靠性和通用性。在程序设计中,在划分模块时要求模块的“内聚性”强,与其他模块的“耦合性”弱。即模块的功能要单一(不要把许多不相干的功能放到一个模块中),与其他模块的相互影响要尽量少,而用全局变量是不符合这个原则的。一般要求把C程序中的函数做成一个封闭体,除了可以通过“实参——形参”的渠道与外界发生联系外,没有其他渠道。这样的程序移植性好,可读性强。
-
使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬时各个外部变量的值。在各个函数执行时都可能改变外部变量的值,程序容易出错。因此,要限制使用全局变量。
(3)如果在同一个源文件中,外部变量和局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。
声明:本文章为个人学习笔记,资料整理参考谭浩强《C程序设计(第三版)》如有错误,欢迎大家指正!