c語言中區域性變數和全域性變數變數的儲存類別(static,extern,auto,register)
在討論函式的形參變數時曾經提到,形參變數只在被呼叫期間才分配記憶體單元,呼叫結束立即釋放。這一點表明形參變數只有在函式內才是有效的,離開該函式就不能再使用了。這種變數有效性的範圍稱變數的作用域。不僅對於形參變數,c語言中所有的量都有自己的作用域。變數說明的方式不同,其作用域也不同。c語言中的變數,按作用域範圍可分為兩種,即區域性變數和全域性變數。
區域性變數也稱為內部變數。區域性變數是在函式內作定義說明的。其作用域僅限於函式內,離開該函式後再使用這種變數是非法的。
關於區域性變數的作用域還要說明以下幾點:
1)主函式中定義的變數也只能在主函式中使用,不能在其它函式中使用。同時,主函式中也不能使用其它函式中定義的變數。因為主函式也是乙個函式,它與其它函式是平行關係。這一點是與其它語言不同的,應予以注意。
2)形參變數是屬於被調函式的區域性變數,實參變數是屬於主調函式的區域性變數。
3)允許在不同的函式中使用相同的變數名,它們代表不同的物件,分配不同的單元,互不干擾,也不會發生混淆。如在前例中,形參和實參的變數名都為n,是完全允許的。
4)在復合語句中也可定義變數,其作用域只在復合語句範圍內。
全域性變數也稱為外部變數,它是在函式外部定義的變數。它不屬於哪乙個函式,它屬於乙個源程式檔案。其作用域是整個源程式。在函式中使用全域性變數,一般應作全域性變數說明。只有在函式內經過說明的全域性變數才能使用。全域性變數的說明符為extern。但在乙個函式之前定義的全域性變數,在該函式內使用可不再加以說明。
前面已經介紹了,從變數的作用域(即從空間)角度來分,可以分為全域性變數和區域性變數。
從另乙個角度,從變數值存在的作時間(即生存期)角度來分,可以分為靜態儲存方式和動態儲存方式。
靜態儲存方式:是指在程式執行期間分配固定的儲存空間的方式。
動態儲存方式:是在程式執行期間根據需要進行動態的分配儲存空間的方式。
1)程式區;
2)靜態儲存區;
3)動態儲存區;
全域性變數全部存放在靜態儲存區,在程式開始執行時給全域性變數分配儲存區,程式行完畢就釋放。在程式執行過程中它們佔據固定的儲存單元,而不動態地進行分配和釋放;
1)函式形式引數;
2)自動變數(未加static宣告的區域性變數);
3) 函式呼叫實的現場保護和返回位址;
對以上這些資料,在函式開始呼叫時分配動態儲存空間,函式結束時釋放這些空間。
在c語言中,每個變數和函式有兩個屬性:資料型別和資料的儲存類別。
函式中的區域性變數,如不專門宣告為static儲存類別,都是動態地分配儲存空間的,資料儲存在動態儲存區中。函式中的形參和在函式中定義的變數(包括在復合語句中定義的變數),都屬此類,在呼叫該函式時系統會給它們分配儲存空間,在函式呼叫結束時就自動釋放這些儲存空間。這類區域性變數稱為自動變數。自動變數用關鍵字auto作儲存類別的宣告。
a是形參,b,c是自動變數,對c賦初值3。執行完f函式後,自動釋放a,b,c所佔的儲存單元。
關鍵字auto可以省略,auto不寫則隱含定為「自動儲存類別」,屬於動態儲存方式。
有時希望函式中的區域性變數的值在函式呼叫結束後不消失而保留原值,這時就應該指定區域性變數為「靜態區域性變數」,用關鍵字static進行宣告。
1)靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元。在程式整個執行期間都不釋放。而自動變數(即動態區域性變數)屬於動態儲存類別,佔動態儲存空間,函式呼叫結束後即釋放。
2)靜態區域性變數在編譯時賦初值,即只賦初值一次;而對自動變數賦初值是在函式呼叫時進行,每呼叫一次函式重新給一次初值,相當於執行一次賦值語句。
3)如果在定義區域性變數時不賦初值的話,則對靜態區域性變數來說,編譯時自動賦初值0(對數值型變數)或空字元(對字元變數)。而對自動變數來說,如果不賦初值則它的值是乙個不確定的值。
為了提高效率,c語言允許將區域性變數得值放在cpu中的暫存器中,這種變數叫「暫存器變數」,用關鍵字register作宣告。
說明:
1) 只有區域性自動變數和形式引數可以作為暫存器變數;
2)乙個計算機系統中的暫存器數目有限,不能定義任意多個暫存器變數;
3)區域性靜態變數不能定義為暫存器變數。
外部變數(即全域性變數)是在函式的外部定義的,它的作用域為從變數定義處開始,到本程式檔案的末尾。如果外部變數不在檔案的開頭定義,其有效的作用範圍只限於定義處到檔案終了。如果在定義點之前的函式想引用該外部變數,則應該在引用之前用關鍵字extern對該變數作「外部變數宣告」。表示該變數是乙個已經定義的外部變數。有了此宣告,就可以從「宣告」處起,合法地使用該外部變數。
說明:在本程式檔案的最後1行定義了外部變數a,b,但由於外部變數定義的位置在函式main之後,因此本來在main函式中不能引用外部變數a,b。現在我們在main函式中用extern對a和b進行「外部變數宣告」,就可以從「宣告」處起,合法地使用該外部變數a和b。
C語言中區域性變數與全域性變數在記憶體中的存放位置
c語言中區域性變數和全域性變數變數的儲存類別 static,extern,auto,register 在討論函式的形參變數時曾經提到,形參變數只在被呼叫期間才分配記憶體單元,呼叫結束立即釋放。這一點表明形參變數只有在函式內才是有效的,離開該函式就不能再使用了。這種變數有效性的範圍稱變數的作用域。不僅...
C語言中區域性變數與全域性變數在記憶體中的存放位置
c語言中區域性變數和全域性變數變數的儲存類別 static,extern,auto,register 在討論函式的形參變數時曾經提到,形參變數只在被呼叫期間才分配記憶體單元,呼叫結束立即釋放。這一點表明形參變數只有在函式內才是有效的,離開該函式就不能再使用了。這種變數有效性的範圍稱變數的作用域。不僅...
C語言中區域性變數與全域性變數在記憶體中的存放位置
c語言中區域性變數和全域性變數變數的儲存類別 static,extern,auto,register 在討論函式的形參變數時曾經提到,形參變數只在被呼叫期間才分配記憶體單元,呼叫結束立即釋放。這一點表明形參變數只有在函式內才是有效的,離開該函式就不能再使用了。這種變數有效性的範圍稱變數的作用域。不僅...