標籤:
我們知道,從變數的範圍(即從空間)角度來分,可以分為全域變數和局部變數。
從另一個角度,從變數值存在的作時間(即生存期)角度來分,可以分為靜態儲存方式和動態儲存方式。
- 靜態儲存方式:是指在程式運行期間分配固定的儲存空間的方式。
- 動態儲存裝置方式:是在程式運行期間根據需要進行動態分配儲存空間的方式。
使用者儲存空間可以分為三個部分:
- 程式區;
- 靜態儲存區;
- 動態儲存裝置區。
全域變數全部存放在靜態儲存區,在程式開始執行時給全域變數分配儲存區,程式行完畢就釋放。在程式執行過程中它們佔據固定的儲存單元,而不動態地進行分配和釋放。
動態儲存裝置區存放以下資料:
- 函數形式參數;
- 自動變數(未加static聲明的局部變數);
- 函數調用時的現場保護和返回地址。
對以上這些資料,在函數開始調用時分配動態儲存裝置空間,函數結束時釋放這些空間。
在C語言中,每個變數和函數有兩個屬性:資料類型和資料的儲存類別。
auto變數
函數中的局部變數,如不專門聲明為static儲存類別,都是動態地分配儲存空間的,資料存放區在動態儲存裝置區中。
函數中的形參和在函數中定義的變數(包括在複合陳述式中定義的變數),都屬此類,在調用該函數時系統會給它們分配儲存空間,在函數調用結束時就自動釋放這些儲存空間。這類局部變數稱為自動變數。自動變數用關鍵字auto作儲存類別的聲明。
關鍵字auto可以省略,auto不寫則隱含定為“自動儲存類別”,屬於動態儲存裝置方式。
用static聲明局部變數
有時希望函數中的局部變數的值在函數調用結束後不消失而保留原值,這時就應該指定局部變數為“靜態局部變數”,用關鍵字static進行聲明。
對靜態局部變數的說明:
- 靜態局部變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元。在程式整個運行期間都不釋放。而自動變數(即動態局部變數)屬於動態儲存裝置類別,占動態儲存裝置空間,函數調用結束後即釋放。
- 靜態局部變數在編譯時間賦初值,即只賦初值一次;而對自動變數賦初值是在函數調用時進行,每調用一次函數重新給一次初值,相當於執行一次指派陳述式。
- 如果在定義局部變數時不賦初值的話,則對靜態局部變數來說,編譯時間自動賦初值0(對數值型變數)或Null 字元(對字元變數)。而對自動變數來說,如果不賦初值則它的值是一個不確定的值。
register變數
為了提高效率,C語言允許將局部變數得值放在CPU中的寄存器中,這種變數叫“寄存器變數”,用關鍵字register作聲明。
對寄存器變數的幾點說明:
- 只有局部自動變數和形式參數可以作為寄存器變數;
- 一個電腦系統中的寄存器數目有限,不能定義任意多個寄存器變數;
- 局部靜態變數不能定義為寄存器變數。
用extern聲明外部變數
外部變數(即全域變數)是在函數的外部定義的,它的範圍為從變數定義處開始,到本程式檔案的末尾。如果外部變數不在檔案的開頭定義,其有效作用範圍只限於定義處到檔案終了。如果在定義點之前的函數想引用該外部變數,則應該在引用之前用關鍵字extern對該變數作“外部變數聲明”。表示該變數是一個已經定義的外部變數。有了此聲明,就可以從“聲明”處起,合法地使用該外部變數。
1 #include<stdio.h>2 int main()3 {4 extern a;5 printf("%d", a);6 return 0;7 }8 int a = 9;
C語言變數的儲存類別