1. 程式人生 > >C語言中變數的作用域與儲存型別

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; 只有風格之差,沒有效率之別。