C語言 儲存類說明符

2021-07-27 23:56:02 字數 2883 閱讀 1308

一 儲存類
有關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 浮點數,十進位制...