【时时三省】(C语言基础)局部变量和全局变量
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省
以前所见到的程序大多数是一个程序只包含一个main函数,变量是在函数的开头处定义的。这些变量在本函数范围内有效,即在本函数开头定义的变量,在本函数中可以被引用。在本章中见到的一些程序,包含两个或多个函数,分别在各函数中定义变量。有的读者自然会提出一个问题:在一个函数中定义的变量,在其他函数中能否被引用?在不同位置定义的变量,在什么范围内有效?
这就是变量的作用域问题。每一个变量都有一个作用域问题,即它们在什么范围内有效。
局部变量
定义变量可能有3种情况:
( 1 )在函数的开头定义;
( 2 )在函数内的复合语句内定义;
( 3 )在函数的外部定义。
在一个函数内部定义的变量只在本函数范围内有效,也就是说只有在本函数内才能引用它们,在此函数以外是不能使用这些变量的。在复合语句内定义的变量只在本复合语句范围内有效,只有在本复合语句内才能引用它们。在该复合语句以外是不能使用这些变量的,以上这些称为“局部变量”。
例如,在funl函数中定义了变量a,b,在fun2函数中定义了变量a. c。funl函数中的变量a和fun2函数中的变量a不是同一个对象。它们分别有自己的有效范围。正如高一甲班有一学生叫王建国,高一乙班也有一学生叫王建国,二者不是同一个人。不同的班允许有同名的学生,互不干扰。高一甲班点名时,只有该班的王建国喊“到”,乙班的王建国不在甲班活动,不会同时喊“到”的。他们的活动范围局限在本班,或者说这些名字的有效范围是局部的(只在本班有效)。
例如:
float fl ( int a )
{
int b,c;
...
}
a,b,c有效
char f2 ( int x , int y )
{
int i , j ;
...
}
x,y,i,j有效
int main ( )
{
int m , n ;
return 0;
...
}
m,n有效
说明:
( 1 )主函数中定义的变量(如m , n )也只在主函数中有效,并不因为在主函数中定义而在整个文件或程序中有效。主函数也不能使用其他函数中定义的变量。
( 2 )不同函数中可以使用同名的变量,它们代表不同的对象,互不干扰。例如,上面在f1函数中定义了变量b和c,倘若在f2函数中也定义变量b和c ,它们在内存中占不同的单元,不会混淆。
( 3 )形式参数也是局部变量。例如上面fl函数中的形参a,也只在fl函数中有效。其他函数可以调用fl函数,但不能直接引用fl函数的形参a(例如想在其他函数中输出a的值是不行的)。
( 4 )在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也称为“分程序”或“程序块”。
全局变量
程序的编译单位是源程序文件,一个源文件可以包含一个或若干个函数。在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。
注意:在函数内定义的变量是局部变量,在函数外定义的变量是全局变量。
例如:
int p = 1,q = 5;//定义外部变量
float f1 ( int a ) //定义函数f1
{
int b,c;
...
}
char c1,c2;
char f2 ( int x , int y )
{
int i , j ;
}
int main ( ) //主函数
{
int m , n ;
...
return 0 ;
}
p,q,cl,c2都是全局变量,但它们的作用范围不同,在main函数和f2函数中可以使用全局变量p,q,cl,c2,但在函数fl中只能使用全局变量p,q,而不能使用c1和c2。
在一个函数中既可以使用本函数中的局部变量,也可以使用有效的全局变量。打个通俗的比方:国家有统一的法律和法规,各省还可以根据需要制定地方的法律和法规。在甲省,国家统一的法律法规和甲省的法律法规都是有效的,而在乙省,则国家统一的法律法规和乙省的法律法规有效。显然,甲省的法律法规在乙省无效。
说明:
设置全局变量的作用是增加了函数间数据联系的渠道。由于同一文件中的所有函数都能引用全局变量的值,因此如果在一个函数中改变了全局变量的值,就能影响到其他函数中全局变量的值。相当于各个函数间有直接的传递通道。由于函数的调用只能带回一个函数返回值,因此有时可以利用全局变量来增加函数间的联系渠道,通过函数调用能得到一个以上的值。
为了便于区别全局变量和局部变量,在C程序设计人员中有一个习惯(但非规定),将全局变量名的第1个字母用大写表示。