我们知道函数中的形参变量只有被调用的时候才分配内存单元,调用结束立即释放。这说明形参变量只有在函数内部才有效,离开函数就不能使用了。这种变量的有效性范围叫做变量的作用域。c语言中的变量按作用域范围可以分为局部变量和全局变量两种。
1.局部变量
变量在函数内部定义,则变量具有从定义位置开始到函数结束为止的局部作用域。如果变量在某个复合语句内定义,变量具有从定义位置开始到复合语句结束为止的局部作用域,这样具有局部作用域的变量称为局部变量或内部变量。
例如:
int func( int a) 形参a的作用域起点
{
int b,c; 局部变量b,c的作用域起点
if(b>a)
{
int x,y; 局部变量x,y的作用域起点
x = 2;
......
} 局部变量x,y的作用域终点
......
} 形参a以及局部变量b,c的作用域终点
int main()
{
int i,j; 局部变量i,j的作用域起点
.....
} 局部变量i,j的作用域终点
在这里我们需要注意一下几点:
(1)主函数中定义的变量只能在主函数中使用,不能在其他函数中使用,同样主函数也不能使用其他函数中定义的变量,主函数与其他函数是一种平行关系。
(2)形参被调函数的局部变量,实参是主调函数的局部变量。
(3)允许在不同函数中使用同名的变量,但是这些变量代表不同的形象,分配不同的单元,互不干扰。
(4)在函数的复合语句中也可以定义变量,其作用域只在复合语句范围内。
局部变量有4中变量类型
(1)自动变量:在函数内定义,在函数内部有效,离开函数值就消失,是一种动态存储。
(2)局部静态变量:在函数内定义,在函数内有效,离开函数值仍保留,是一种静态存储。
(3)寄存器变量:在函数内定义,函数内有效,离开函数,值就消失,是一种寄存器存储。
(4)形参:函数被调用时定义,函数内部有效,离开函数值就消失,是一种动态存储。
2.全局变量
变量在所有函数的外部定义,其变量具有全局作用域,作用范围从变量的定义。位置开始到变量所在源文件结尾结束。具有全局作用域的变量叫做全局变量或外部变量。
全局变量的注意事项:
(1)使用全局变量可以增加各个函数之间的数据传输渠道,在一个函数中改变一个全局变量的值,在另一个函数中就可以利用。
(2)函数在执行时要依赖其所在的外部变量,如果将一个函数移植到另外一个文件中,还需要将有关的外部变量一起移植过去。如果外部变量与文件中的变量同名时就会出现问题,所以函数的全局变量会降低程序的可移植性,所以要慎用。
(3)如果在同一个源文件中局部变量与全局变量同名,在局部变量的作用域范围内,全局变量不起作用。
全局变量有两种变量类型
(1)外部静态变量:函数外用static 定义,从定义点到程序结尾都有效,程序运行结束值才消失,在本文件内有效,是一种静态存储。
(2)非静态外部变量:函数外定义,从定义点到程序结尾都有效,程序运行结束值才消失,其他文件可以引用,是一种静态变量。