局部变量和全局变量

已知,一个C语言源程序中可以包含若干函数。各函数间的数据通信除了可以通过参数传递来实现之外,还可以通过使用公共的数据来实现。那么,哪些数据可以被各函数共用而哪些数据又不能共用呢?这就涉及到变量的作用范围问题。

局部变量

    在一个函数内部定义的变量只在本函数范围内有效,只有在本函数中才能使用它,在定义它的函数之外是不能使用它的。这种变量称为“局部变量”。

例:

    显然,形参也属于局部变量,如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就立即被释放。

由于全局变量在整个程序中可以被所有的函数所使用,所以,利用全局变量可以很方便地实现主调函数之间的数传递和返回。特别是当你希望从被调函数中得到一个以上的返回值时,全局变量就非常有用了,这是在实际编程中经常使用的方法。

posted @ 2007-03-02 09:52  '.Elvis.'  阅读(631)  评论(0编辑  收藏  举报