局部变量

在一个函数内部定义的变量称为局部变量,它的作用域仅限于该函数内,也就是说只有本函数内才能使用它们,在此函数以外是不能使用这些变量的。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
int f1(int a)
{
int b, c; /* a, b, c 有效 */
...
}

char f2(int x, int y)
{
int i, j; /* x, y, i, j 有效*/
...
}

void main()
{
int m, n; /* m, n 有效*/
}

几点说明:
1) main函数中定义的变量也是局部变量,只能在main函数中使用;同时,main函数中也不能使用其它函数中定义的变量。main 函数也是一个函数,与其它函数地位平等。
2) 不同函数中可以使用相同名字的变量,它们代表不同的对象,在内存中站不同的单元,互不混淆。
3) 形式参数也是局部变量。实参给形参传值的过程也就是给局部变量赋值的过程
4) 在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也称为“分程序”“语句块”.

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
void main()
{
int a, b; /* a, b 在整个本函数内 有效*/
...
{
int c; /* c 只在当前{} 内有效*/
c = a+b;
...
}
...
}

变量c只在复合语句(程序块)内有效,离开该复合语句该变量就无效,释放内存。

全局变量

程序的编译单位是源程序文件,一个源文件可以包含一个或若干个函数。在函数内部定义的变量是局部变量,而在函数之外定义的而变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int p=1, q=5;               /*  p, q 在整个源文件中有效 */
float f1(int a)
{
int b, c;
...
}

char c1, c2; /* 外部变量 c1, c2 在此位置到文件结尾有效 */
char f2(int x, int y)
{
int i, j;
...
}

void main()
{
...
}

为了便于区分局部变量和全局变量,在C程序设计人员中有一个习惯(但非规定),将全局变量名的第一个字母用大写表示。

说明:
1) 设置全局扁郎是增加了函数间数据联系的取到。由于同一文件中的所有函数都能引用全局变量的值,因此如果在一个函数中改变了全局变量的值,就能狗影响到其他函数,相当于各个函数间有直接的传递通道。由于函数的调用只能带回一个返回值,因此有时候可以利用全局变量增加函数间的联系通道,通过函数调用能够得到一个以上的值。
2) 建议不在必要时不要使用全局变量,原因如下
① 全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。
② 它是函数的通用性降低了,因为函数在执行时要依赖于其所在的外部变量。如果将一个函数移植到另一个文件中,还要将有关的外部变量及值一起移植过去。但若该外部变量与其他文件与其他文件的变量名冲突时,就会出现问题,降低了程序的可靠性和通用性。在程序设计中,在划分模块式要求模块的**内聚性**强、与其他模块的**耦合性**弱。即模块的功能要单一(不要把许多互不相干的功能放到一个模块中),与其他模块的相互影响要尽量少,而用全局变量是不符合这个原则的。一般要求把c程序中的函数做成一个封闭体,除了可以通过实参——形参的渠道与外界发生联系外,没有其他渠道。这样的程序移植性好,可读性强。
③ 使用全局变量过多,会降低程序的清晰性,人们往往难以清楚的判断出每个瞬时各个外部变量的值。在各个函数执行时都有坑呢改变外部变量的值,程序容易出错。因此,要限制使用外部变量
④ 如果在同一个源文件件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被屏蔽,即它不起作用。