C語言中變數的作用域與儲存型別
1. 全域性變數與區域性變數
任何函式或變數均只能定義一次,可宣告多次。定義在程式碼塊之內(函式塊內)的變數為區域性變數,定義在函式外部的變數為全域性變數,作用範圍是整個專案(不單單是本檔案),因此也不能在其它檔案中再次定義同名變數,函式也是如此。
2. extern的用法
想使用其它原始檔中定義的函式或全域性變數,只需在本檔案中新增宣告語句即可。例如extern intvar_name;extern不是必需,但加上更規範。若在程式碼塊內使用其它檔案的全域性變數,則必需用extern(不然變成了新建一個區域性變數),且作用域是該程式碼塊。
3. static的用法
如果在定義函式或全域性變數的時候用了static,則把函式或全域性變數的作用域由整個專案限定為本檔案,其它檔案將無法使用該函式或變數。
4. 變數的儲存位置
區域性變數儲存在記憶體堆疊,隨著程式碼塊的呼叫動態建立與釋放;全域性變數與函式均儲存在靜態記憶體中,在程式執行期間一直存在。若區域性變數前用static宣告,則儲存位置由堆疊變為靜態記憶體,但作用域仍然是區域性的。全域性變數前加上static的作用只是把作用域由整個專案限制為本檔案,其它不變。
示例程式:
voidmain(){
fun();
fun();
}
voidfun(){
inta=10;
static int b =20;
a++;
b++;
printf("a=%db=%d\n",a,b);
}
執行結果為:
a=11 b=21
a=11 b=22
請按任意鍵繼續. . .
5. 靜態變數與自動變數
由上述程式可以看出,static變數的值是一直存在的,且定義並初始化的語句只在最初執行依次,之後再遇到將會忽略。另外,對於區域性變數宣告為static,因為作用域仍是區域性,因此可在其它程式碼塊內宣告相同名字的static變數,兩個區域性的static變數都儲存在靜態記憶體且具有相同的變數名,但彼此沒有關係。
6. 變數的初始化
a) 靜態變數的初始化只進行一次,且是在可執行檔案載入記憶體時已經確定;而自動變數(即堆疊變數)的初始化是在執行時確定。
b) 如果沒有顯示初始化,靜態變數預設初始化為0,自動變數與暫存器變數的預設初始值是垃圾(即分配的地址上值是多少就預設初始化多少,因此不可用)。
c) 靜態變數的初始化語句必須是字面值常量,因此在運氣前就必須要確定初始值。自動變數的初始化語句可為任何表示式。
d) int a =10 等價於int a; a=10; 只有風格之差,沒有效率之別。