发布日期:2015-12-08 09:13 来源: 标签: 编程语言 C++教程 C++变量 C++外部变量
所谓"外部"是相对于函数"内部"而言的,C语言的外部变量就是定义在所有函数之外的全局变量。它可以被所有的函数访问,在所有函数体的内部都是有效的,所以函数之间可以通过外部变量直接传递数据。
外部变量的定义形式是:
extern 类型说明符 变量名;
所谓"外部"是相对于函数"内部"而言的,C语言的外部变量就是定义在所有函数之外的全局变量。它可以被所有的函数访问,在所有函数体的内部都是有效的,所以函数之间可以通过外部变量直接传递数据。
例9-20: 分析程序运行结果。
#include <stdio.h>
int x; /* 说明外部变量x */
main( )
{ void addone( ), subone( );
x=1; /* 为外部变量x赋值 */
printf ("x begins is %d\n", x);
addone ( ); subone ( ); subone ( );
addone ( ); addone ( );
printf ("x winds up as %d\n", x);
}
void addone ( void )
{ x++; /* 使用外部变量x */
printf ("add 1 to make %d\n", x);
}
void subone(void)
{ x--; /* 使用外部变量x */
printf ("substract 1 to make %d\n", x);
}
  在程序的最前面语句"int x;"说明了变量x;该说明语句的位置在所有函数之外,所以变量"x"为外部变量,对函数main、addone和subone来说,变量x是全局变量,在这些函数的内部都是有效的。
函数addone和subone都是void型函数,它们没有返回值,没有形参。函数间的数据传递都是靠外部变量x进行的。执行程序中,main中将x赋值为1,调用addone函数,"x++"后x为2;调用subone时,"x--"后x为1,第二次调用subone函数,"x--"后x的值为0,分析程序运行过程可以得到程序的执行结果为:
x begins is 1
add 1 to make 2
substract 1 to make 1
substract 1 to make 0
add 1 to make 1
add 1 to make 2
x winds up as 2
  外部变量在编译的时侯由系统分配永久的存储空间。如果外部变量的说明与使用在同一个文件中,则在该文件中的函数在使用外部变量时,不需要再进行其它的说明,可以直接使用。当外部变量的说明与使用在两个不同的文件,要使用其它文件中说明的外部变量,就必须在使用该外部变量之前,使用"extern"存储类型说明符进行变量"外部"说明。
"extern"仅仅是说明变量是"外部的",以及它的类型,并不真正分配存储空间。在将若干个文件连接生成一个完整的可运行程序时,系统会将不同文件中使用的同一外部变量连在一起,使用同一系统分配的存储单元。
C语言中不仅有外部变量,而且有外部函数。由于C语言不允许在函数内部再定义函数,所以一个函数相对于另一函数本身就是外部的。当要调用的函数在另一个文件中时,在要调用的函数中,无论被调用的函数是什么类型,都必须用"extern"说明符说明被调用函数是"外部函数"。
例9-21:下列程序由两个文件组成,请分析运行结果。
/* 文件一 */
int x = 10; /* 定义外部变量x和y */
int y = 10;
void add ( void )
{ y=10+x; x*=2;
}
main ( )
{ extern void sub( ); /* 在调用函数中说明函数sub是void型的外部函数 */
x += 5;
add( ); sub( ); /* 分别调用函数 */
printf ("x=%d; y=%d\n", x, y);
}
/* 文件二 */
void sub (void) /* 函数sub定义在另一个文件中 */
{ extern int x; /* 说明定义在另一个文件中的外部变量x */
x -= 5;
}
  程序由两个文件组成。文件一中说明两个外部变量x和y,main函数中调用了两个函数add和sub。其中函数sub不在文件一中,所以函数main中要使用"extern void sub()"语句说明函数sub是外部函数且无返回值;而函数add是在文件一中定义的,所以不必再进行说明。在文件二的函数sub中,要使用文件一中的外部变量x,所以函数sub中要用"extern int x"语句说明变量x是一个外部整型变量。程序编译后进行连接,文件一和文件二中的外部变量x会连接在一起,使用同一系统分配的存储单元。
运行程序,在main中执行语句"x+=5",即x=10+5=15;然后调用add函数执行"y=10+x",y=10+15=25,执行"x*=2",x=15*2=30;返回main函数后再调用sub函数,执行"x-=5",x=30-5=25。程序最终运行结果为:
    x=25; y=25
例9-22: 分析运行结果。
/* 文件一 */
int x=10; /* 说明外部变量x和y */
int y=10;
extern void sub( ); /* 在所有函数之外说明外部函数sub,则在每个调用外 */
/* 部函数sub的函数中,不再需要进行外部函数说明 */
void add(void)
{ int y=5; /* 说明自动变量y */
y=10+x; x *= 2;
printf("add:y=%d; ", y);
}
main ( )
{ x += 5;
add( ); sub( ); /* 分别调用函数 */
printf ("main:x=%d; main:y=%d\n", x, y);
}
/* 文件二 */
extern int x; /* 说明另一文件中的外部变量x */
void sub(void)
{ int y=5; /* 说明自动变量y */
x -= y;
printf("sub:y=%d; ", y);
}
  本程序与上例比较,在add函数内部使用"int y=5"语句说明了变量y。add函数内部的变量"y"与外部变量"y"不是同一变量。外部变量"y"是全局变量,在所有函数内部有效,而函数add中定义的变量"y"是自动变量,它局部于函数add本身。两个变量根本不同。由于函数add内部已经重新说明了同名的自动变量"y",所以外部变量"y"在函数add内部是不可见的,函数add不能再对外部变量y进行数据存取。所以在add内部"y=10+x"仅仅是修改了自动变量"y"的值,而对外部变量"y"的值无丝毫影响,同样在函数sub内部也定义了一个自动变量y。调用sub函数,执行"y=5",这时的"y"是sub内部定义的自动变量,它的值为5,与外部变量"y"没任何关系。在sub()执行语句中"x-=y"时的取值是自动变量y的值。所以程序运行结果为:
add:y=25; sub:y=5; main:x=25; main:y=10
  外部变量的特点,决定了它可以在函数之间传递数据。在程序设计中,函数与函数之间传递数据是通过函数的参数及函数的返回值实现,由于函数只能返回一个值,这就有一定的局限性,而外部变量不受数量的限制。但外部变量不宜过多,因为,一方面,外部变量始终占据内存单元,会使程序的运行受到一定的影响,另一方面,外部变量使得程序各模块之间牵连太多,当一个外部变量的值被误改的时候,会给后续模块带来意外的错误。

相关评论

专题信息
    C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持多种编程范式 --面向对象编程、泛型编程和过程化编程。最新正式标准C++于2014年8月18日公布。 其编程领域众广,常用于系统开发,引擎开发等应用领域,是至今为止最受广大程序员受用的最强大编程语言之一,支持类:类、封装、重载等特性! 本教程从基础讲解了C++语言,希望对大家有所帮助,望多多支持中国站长网络学院。