局部变量和全局变量
局部变量
在一个函数内部定义的变量只在本函数范围内有效,只有在本函数中才能使用它,在定义它的函数之外是不能使用它的。这种变量称为“局部变量”。
例:
显然,形参也属于局部变量,如f1()函数中的形参n。
说明:
局部变量只在定义它的函数内有效,即使对主函数也不例外。千万不要以为在主函数中定义的变量就可以被其它函数引用。 |
例:
main()
{
int a=10;
f();
}
f()
{
int b;
b=a*a;
printf("%d",b);
}
这个程序在编译时会产生下面的出错信息:
Undefined symbol 'a' in function f
意为“在f()函数中没有定义标识符a。因为变量a是在主函数中定义的,它只能在主函数内使用,而不能在f()函数中使用。
不同函数中定义的局部变量允许取相同的变量名,它们互不影响。 |
例:
main()
{
int a=10;
f();
printf("main():a=%d\n",a);
}
f()
{
int a=20;
printf("f ():a=%d\n",a);
}
主函数和f()函数中都定义了局部变量a,在主函数中定义的变量a只在主函数内有效,同样,在f()函数中定义的变量a只在f()函数内有效。事实上,这两个同名变量在内存中各占不同的存储单元,所以它们互不干扰。
可以在任何复合语句中定义局部变量,其作用范围只局限在本复合语句之中,一旦离开了定义它的复合语句,该局部变量的使命即告完成,并且也就消亡了。 |
例:
main()
{
int x=10;
{
int x=100;
printf("1:x=%d\n",x);
}
printf("2:x=%d\n",x);
}
程序main函数中定义了两个同名的局部变量x,这两个x实际上是占用不同的内存单元,它们互不干扰。其中,第二个x(值为100)是在一个复合语句中定义的,当该复合语句执行完后,第二个x就不再存在了。所以,最后一次输出的x的值是第一个x的值(即为10)。
全局变量
全局变量是在函数之外定义的变量,其有效范围是:从定义变量的位置开始到本源程序结束。
例:
说明:
全局变量可以被程序中的各函数所共用。 |
例:
int x; /*定义全局变量x */
main()
{
x=10;
printf("1:x=%d\n",x);
f();
printf("2:x=%d\n",x);
}
f()
{
x++; /*在f()函数中引用全局变量x*/
}
主函数和f()函数中都没有定义变量x,但这两个函数都使用了它,这是因为x是在程序的开头定义的全局变量。主函数中给x赋初值为10,随后在调用执行f()函数时x的值自增为11,即使在f()函数执行完之后这个值(11)也仍然存在。所以,主函数中第二次输出的x的值是11,而不是10。
一个函数也可以使用在该函数之后定义的全局变量,这时必须在该函数中用extern。说明要使用全局变量已在函数的外部定义过了,以便让编译程序作出相应的处理。 |
例:
int x=10;
main()
{
int a;
extern y;
a=x+y;
printf("a=%d\n",a);
}
int y=20;
如果把这个程序中的“extern y;"去掉,那么在程序编译时就会出现下面的出错信息:
Undefined symbol 'y'in function main
意为“主函数中的标识符y没有定义”。
全局变量可以与局部变量同名,这时,在局部变量的作用范围内,全局变量不起作用。 |
例:
int a=10;/*定义全局变量a*/
main()
{
a++;
f();
printf("2:a=%d\n",a); /*输出全局变量a的值*/
}
f()
{
int a=20; /*在f()函数中定义局部变量a*/
printf("1:a=%d\n",a); /*输出局部变量a的值*/
}
由于在f()函数中又定义了变量a,所以凡是在f()函数中出现的变量a都是这个局部变量a,它与在主函数之前定义的全局变量a无关。一旦f()函数中定义并使用的局部变量a就立即被释放。
由于全局变量在整个程序中可以被所有的函数所使用,所以,利用全局变量可以很方便地实现主调函数之间的数传递和返回。特别是当你希望从被调函数中得到一个以上的返回值时,全局变量就非常有用了,这是在实际编程中经常使用的方法。 |