附錄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


  外部變量的特點,決定了它可以在函數之間傳遞數據。在程序設計中,函數與函數之間傳遞數據是通過函數的參數及函數的返回值實現,由於函數只能返回一個值,這就有一定的侷限性,而外部變量不受數量的限制。但外部變量不宜過多,因爲,一方面,外部變量始終佔據內存單元,會使程序的運行受到一定的影響,另一方面,外部變量使得程序各模塊之間牽連太多,當一個外部變量的值被誤改的時候,會給後續模塊帶來意外的錯誤。

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