一 儲存類
有關c語言的儲存類,推薦的參考資料:c primer plus,其中有一章專門講解這個;
在理解c的儲存類之前,首先要搞懂的概念有:作用域、生存週期、連線屬性
c中的儲存類說明符實際上是上述屬性的不同組合
作用域
:乙個c變數的作用域可以是
**塊作用域
(在函式內部**塊中定義的變數、形參,稱為
區域性變數),
函式原型作用域
(從變數定義處一直到原型宣告的末尾),
檔案作用域
(乙個在所有函式之外定義的變數,
從定義處到包含定義的檔案結尾處都可見,稱為
全域性變數),
函式作用域
(只適應於goto語句使用的標籤),函式作用域意味著乙個特定函式中的goto標籤對該函式中任何地方的**都是可見的,無論該標籤出現在哪乙個**塊中。
連線:乙個c
變數具有以下連線之一
外部連線
內部連線
空連線
具有**塊作用域
和函式原型作用域
的變數是
空連線,由定義所在的**塊和函式原型所私有
具有外部連線的變數可以在多檔案程式的任何地方使用,多個檔案可有共享。
具有內部連線的變數可以在乙個檔案的任何地方使用,歸該檔案私有。
具有檔案作用域的變數可能是內部連線或者外部連線。
如果乙個具有檔案作用域的變數用static修飾,則是內部連線,否則是外部連線。
儲存時期
:乙個c
變數具有以下兩種儲存時期之一,
靜態儲存時期
(在程式執行期間一直存在)和
自動儲存時期
靜態儲存時期
:在程式執行期間一直存在。具有檔案作用域(不管是內部連線還是外部連線)的變數具有此儲存週期,注意對於具有檔案作用域的變數,static標明連線型別不是儲存時期。
自動儲存時期
:具有**塊作用域的變數一般是自動儲存週期。在程式進入定義的變數**塊中時在棧中分配記憶體,退出時釋放記憶體。
5種儲存類
儲存類時期作用域
連線宣告方式
自動自動
**塊空
**塊內
暫存器自動
**塊空
**塊內,使用關鍵字register
具有外部連線的靜態
靜態檔案
外部所有函式之外
具有內部連線的靜態
靜態檔案
內部所有函式之外,使用關鍵字static
空連線的靜態
靜態**塊
空**塊內,使用關鍵字static
自動變數
:用auto修飾或者不修飾就預設屬於自動儲存類的變數,具有自動儲存週期、**塊作用域、空連線。在預設下,在**快或者函式的頭部定義的任意變數都屬於自動儲存類。
如果在內層中使用和外層一樣名字的變數,則內層會覆蓋外層變數,在程式離開內層**塊時,外部變數就恢復了其作用和之前的值。
對於自動變數,除非顯式的初始化,否則不會自動初始化。
暫存器變數:通過register宣告,放在暫存器而非記憶體中,所以無法獲得其位址。注意,有時候雖然請求了把變數放於暫存器中,但是由於暫存器的個數,並不一定能滿足,所以暫存器變數就成為了普通變數,不過依然不能對其取址。
具有**塊作用域的靜態變數:通過static
修飾,如果不現實對其初始化,則自動初始化為0(提供了靜態時期),在**塊內宣告(提供了**塊作用域和空連線),建立具有**塊作用域兼具靜態儲存的區域性變數。這些變數具有**塊作用域,空連線,靜態儲存時期。變數一旦被定義便一直存在直到程式結束。
int main(void)
return 0; }
void f(void)
結果:
count = 1
fade = 1 and stay = 1;
count = 2
fade = 1 and stay = 2;
count = 3
fade = 1 andstay = 3;
這是因為靜態變數和外部變數在程式調入記憶體時已經就位了,把這個語句放在f()中是為了告訴編譯器只有函式f()能看到該變數。
具有外部連線的靜態變數:具有檔案作用域、外部連線、靜態時期(外部儲存類,外部變數)。
額外說明,外部變數只可進行一次初始化,而且在定義的時候。
具有內部連線的靜態變數:用static在所有函式的外部進行定義來建立,靜態儲存時期、檔案作用域、內部連線。
二、儲存類說明符
auto 標明乙個變數具有自動儲存時期,該說明符只能用在具有**塊作用域的變數宣告中。
register 只能用在具有**塊作用域的變數。請求乙個變數儲存在暫存器中一邊快速使用,但是不能獲得改變量的位址。
static 用於具有**塊作用域的變數宣告時,使該變數具有靜態儲存時期,從而得以在程式執行期間存在並保留其值,變數仍保留**塊作用域和空連線。若用於具有檔案作用域的變數宣告時,使該變數具有內部連線。
extern 表明在宣告乙個在其他地方定義了的變數。
const 將資料定為不變的,在只能定義宣告,以後不可改變其值。在指標中使用時,const的位置決定是指標本身不變還是指標指向的資料不變。
volatile 說明資料除了可以被程式修改外還可以被其他**修改,主要用於編譯器優化。
restrict 只能用於修飾指標,限定的指標被認為是提供了對其所在指向的資料塊的唯一訪問途徑。
C語言之儲存類說明符
作用域 鏈結屬性 儲存時期 儲存型別內容請先參考博文 c語言有5中儲存型別修飾符 autoregisterstaticexterntypedef 下面分別介紹各說明符的用法 extern 表明識別符號具有外部鏈結屬性或者該變數在別處定義 想要理解extern的用法首先要理解c語言的宣告與定義的區別 ...
c語言中儲存類說明符的理解
auto 用於 塊作用區域的變數宣告 就是最一般情況下的變數宣告,register 僅用於 塊作用區域的變數,請求指令,請求該變數儲存在乙個暫存器中 static 用於 塊作用的區域時 該變數具有靜態儲存時期,相當於在整個程式執行中一直存在。用於檔案作用域時,該變數具有內部鏈結,則改變量在該檔案中可...
C語言轉換說明符
格式轉換說明符printf scanf 本文 表一 轉換說明符及作為結果的列印輸出 轉換說明 輸 出 a 浮點數 十六進製制數字和p 記數法 c99 a浮點數 十六進製制數字和p 記數法 c99 c乙個字元 d 有符號十進位制整數 e 浮點數 e 記數法 e 浮點數 e 記數法 f 浮點數,十進位制...