一、问题
全局变量是什么样的?如何使⽤呢?
二、解答
全局变量也称为外部变量,即在函数之外定义的变量,其有效作⽤范围从定义变量的位置开始到本源⽂件结束。
#include <stdio.h>
int a, b;
void f1()
{
...
}
float x, y;
int f2()
{
...
}
char c1, c2;
char f3()
{
...
}
int main()
{
...
}
a、 b、x、y、c1、c2 都是全局变量,但是它们的作⽤范围不同,在 main( )、f3( ) 、 f2( ) 及f1( ) 函数中可以使⽤变量a和b,在 main( ) 、f3( ) 、f2( ) 函数中可以使⽤变量 x 和 y ,在main( ) 、f3( ) 函数中可以使⽤变量 c1 和 c2。
来看⼀个具体的应⽤实例。通过键盘输⼊⼀组数据,找出这组数据中的最⼤数与最⼩数,将最⼤数与最⼩数的位置互换,将互换后的这组数据再次输出。代码如下。
#include <stdio.h>
int min = 10000, max = 0;
void change(int a[], int n)
{
int i, j, k;
for (i = 0; i < n; i++)
{
if (a[i] < min)
{
min = a[i];
j = i;
}
}
for (i = 0; i < n; i++)
{
if (a[i] > max)
{
max = a[i];
k = i;
}
}
a[k] = min;
a[j] = max;
printf("\nThe position of min is:%3d\n", j);
printf("The position of max is:%3d\n", k);
printf("Now the array is:\n");
for (i = 0; i < n; i++)
{
printf("%5d ", a[i]);
}
}
int main()
{
int a[20], i, n;
printf("Please input the number of elements:\n");
scanf("%d", &n);
printf("Please input the elements:\n");
for (i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
change(a, n);
printf("\nmax=%5d\nmin=%5d\n", max, min);
return 0;
}
程序运⾏结果如下:
Please input the number of elements:
5
Please input the elements:
34 45 73 46 21 56
The position of min is: 4
The position of max is: 2
Now the array is:
34 45 21 46 73
max= 73
min= 21
在上述程序中,max、min 是全局变量,所以在函数 change( ) 和 main( ) 中都可以引⽤。 在main( ) 函数中调⽤ max 和 min 输出的结果和在 change( ) 函数中调⽤ max 和 min 的值是⼀致的。如果此时要在 main( ) 函数中输出k的值,则会提示如下所示的错误。
error C2065: 'k': undeclared identifier Error executing cl.exe.
提示错误是因为 k 是局部变量,其作⽤范围仅限于 change( ) 函数中,所以在 main( ) 函数中调⽤时会提示未定义 k 这个变量。
三、总结
建议少使⽤全局变量,其原因有以下3点。
- 全局变量在程序的整个执⾏过程中都将占⽤存储单元,并不是在使⽤时才在内存中为其开辟单元。
- 使⽤全局变量会使函数的可移植性降低,因为函数的执⾏要依赖于其所在的外部变量。如果要将⼀个函数移到另⼀个⽂件中,还要将有关的外部变量及其值⼀起移过去。如果再出现和其他变量重名的问题,就会更⿇烦。
- 全局变量使⽤过多会降低程序的清晰性,因为各个函数执⾏时都有可能改变全局变量的值。