1. 程式人生 > 其它 >新手小白入門C語言第五章:C儲存類

新手小白入門C語言第五章:C儲存類

一 、儲存類

在理解C的儲存類之前,首先要搞懂的概念有:作用域、生存週期、連線屬性

C中的儲存類說明符實際上是上述屬性的不同組合

 

作用域:一個C變數的作用域可以是

程式碼塊作用域(在函式內部程式碼塊中定義的變數、形參,稱為區域性變數),

函式原型作用域(從變數定義處一直到原型宣告的末尾),

檔案作用域(一個在所有函式之外定義的變數,從定義處到包含定義的檔案結尾處都可見,稱為全域性變數),

函式作用域(只適應於goto語句使用的標籤),函式作用域意味著一個特定函式中的goto標籤對該函式中任何地方的程式碼都是可見的,無論該標籤出現在哪一個程式碼塊中。

 

連線:一個C變數具有以下連線之一

外部連線

內部連線

空連線

具有程式碼塊作用域和函式原型作用域的變數是空連線,由定義所在的程式碼塊和函式原型所私有

具有外部連線的變數可以在多檔案程式的任何地方使用,多個檔案可有共享。

具有內部連線的變數可以在一個檔案的任何地方使用,歸該檔案私有。

具有檔案作用域的變數可能是內部連線或者外部連線。

如果一個具有檔案作用域的變數用static修飾,則是內部連線,否則是外部連線。

 

儲存時期:一個C變數具有以下兩種儲存時期之一,靜態儲存時期(在程式執行期間一直存在)和自動儲存時期

靜態儲存時期:在程式執行期間一直存在。具有檔案作用域(不管是內部連線還是外部連線)的變數具有此儲存週期,注意對於具有檔案作用域的變數,static標明連線型別不是儲存時期。

自動儲存時期:具有程式碼塊作用域的變數一般是自動儲存週期。在程式進入定義的變數程式碼塊中時在棧中分配記憶體,退出時釋放記憶體。

自動變數:用auto修飾或者不修飾就預設屬於自動儲存類的變數,具有自動儲存週期、程式碼塊作用域、空連線。在預設下,在程式碼快或者函式的頭部定義的任意變數都屬於自動儲存類。

如果在內層中使用和外層一樣名字的變數,則內層會覆蓋外層變數,在程式離開內層程式碼塊時,外部變數就恢復了其作用和之前的值。

對於自動變數,除非顯式的初始化,否則不會自動初始化。

暫存器變數:通過register宣告,放在暫存器而非記憶體中,所以無法獲得其地址。注意,有時候雖然請求了把變數放於暫存器中,但是由於暫存器的個數,並不一定能滿足,所以暫存器變數就成為了普通變數,不過依然不能對其取址。

具有程式碼塊作用域的靜態變數:通過static修飾,如果不現實對其初始化,則自動初始化為0(提供了靜態時期),在程式碼塊內宣告(提供了程式碼塊作用域和空連線),建立具有程式碼塊作用域兼具靜態儲存的區域性變數。這些變數具有程式碼塊作用域,空連線,靜態儲存時期。變數一旦被定義便一直存在直到程式結束。

Int main(void)
{
  Int count;
For(count = 1;conut < 4;count ++)
{printf(”count = %d\n”,count);
  F();}
Return 0;
}
Void F(void)
{
 Int fade = 1;
Static int stay = 1;
Printf(“fade = %d and stay = %d\n”,fade++,stay++);
}
結果:
Count = 1
Fade = 1 and stay = 1;
Count = 2
Fade = 1 and stay = 2;
Count = 3
Fade = 1 and stay = 3;

這是因為靜態變數和外部變數在程式調入記憶體時已經就位了,把這個語句放在f()中是為了告訴編譯器只有函式f()能看到該變數。

 

具有外部連線的靜態變數:具有檔案作用域、外部連線、靜態時期(外部儲存類,外部變數)。

額外說明,外部變數只可進行一次初始化,而且在定義的時候。

具有內部連線的靜態變數:用static在所有函式的外部進行定義來建立,靜態儲存時期、檔案作用域、內部連線。

 

二、儲存類說明符

Auto 標明一個變數具有自動儲存時期,該說明符只能用在具有程式碼塊作用域的變數宣告中。

Register 只能用在具有程式碼塊作用域的變數。請求一個變數儲存在暫存器中一邊快速使用,但是不能獲得改變數的地址。

Static 用於具有程式碼塊作用域的變數宣告時,使該變數具有靜態儲存時期,從而得以在程式執行期間存在並保留其值,變數仍保留程式碼塊作用域和空連線。若用於具有檔案作用域的變數宣告時,使該變數具有內部連線。

Extern 表明在宣告一個在其他地方定義了的變數。

Const 將資料定為不變的,在只能定義宣告,以後不可改變其值。在指標中使用時,const的位置決定是指標本身不變還是指標指向的資料不變。

Volatile 說明資料除了可以被程式修改外還可以被其他代理修改,主要用於編譯器優化。

Restrict 只能用於修飾指標,限定的指標被認為是提供了對其所在指向的資料塊的唯一訪問途徑。

搜尋

複製