附录1 外部变量

外部变量的定义形式是:
extern
类型说明符 变量名;
所谓"外部"是相对于函数"内部"而言的,C语言的外部变量就是定义在所有函数之外的全局变量。它可以被所有的函数访问,在所有函数体的内部都是有效的,所以函数之间可以通过外部变量直接传递数据


1 分析程序运行结果。


  在程序的最前面语句"int x;"说明了变量x;该说明语句的位置在所有函数之外,所以变量"x"为外部变量,对函数mainaddonesubone来说,变量x是全局变量,在这些函数的内部都是有效的。
函数addonesubone都是void型函数,它们没有返回值,没有形参。函数间的数据传递都是靠外部变量x进行的。执行程序中,main中将x赋值为1,调用addone函数,"x++"x2;调用subone时,"x--"x1,第二次调用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"说明符说明被调用函数是"外部函数"

 

  例2:下列程序由两个文件组成,请分析运行结果。

  

  程序由两个文件组成。文件一中说明两个外部变量xymain函数中调用了两个函数addsub。其中函数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

 

3 分析运行结果。


  本程序与上例比较,在add函数内部使用"int y=5"语句说明了变量yadd函数内部的变量"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


  外部变量的特点,决定了它可以在函数之间传递数据。在程序设计中,函数与函数之间传递数据是通过函数的参数及函数的返回值实现,由于函数只能返回一个值,这就有一定的局限性,而外部变量不受数量的限制。但外部变量不宜过多,因为,一方面,外部变量始终占据内存单元,会使程序的运行受到一定的影响,另一方面,外部变量使得程序各模块之间牵连太多,当一个外部变量的值被误改的时候,会给后续模块带来意外的错误。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章