C 關鍵字的秘密 中

2021-07-09 11:30:26 字數 2595 閱讀 6499

變數屬性

c語言中變數可以有自己的屬性

定義變數時可加上"屬性"關鍵字

"屬性"關鍵字指明變數的特有意義

語法:auto

auto即c語言中區域性變數的預設屬性

auto表明將被修飾的變數儲存於棧上

編譯器預設所有的區域性變數都是auto

static關鍵字指明變數的"靜態"屬性 即只會被初始化一次

- static修飾的區域性變數儲存在程式的靜態區

static關鍵字同時具有"作用域限定符"的意義

- static修飾的全域性變數作用域只在宣告的檔案中

- static修飾的函式作用域只在宣告的檔案中

register關鍵字指明將區域性變數儲存於暫存器中

register只是請求暫存器變數,但不一定請求成功

register只可修飾區域性變數、函式形參

不能用&運算子獲取register變數的位址

extern 用於宣告"外部"定義的變數和函式

- extern 變數在檔案的其它地方分配空間

- extern 函式在檔案的其它地方定義

extern 用於"告訴"編譯器用c方式編譯

c++編譯器和一些變種c編譯器缺省會按"自己"的方式編譯函式和變數,通過extern關鍵字可命令編譯器"以標準c方式進行編譯"

const修飾的變數是唯讀的,本質還是變數

唯讀變數:不可直接修改它,可通過指標間接修改

const修飾的區域性變數在棧上分配空間

const修飾的全域性變數在全域性資料區分配空間

const修飾的變數會占用記憶體空間

const只在編譯器有用,在執行時無用

tips

const修飾的變數不是真的常量,它只是告訴編譯器變數不能出現在賦值符號左邊

現代c語言編譯器中,修改const全域性變數將導致程式崩潰

標準c語言編譯器不會將const修飾的全域性變數儲存於唯讀儲存區,而是儲存於可修改的全域性資料區,其值可以修改

現代c編譯器中的const將具有全域性生命週期的變數儲存於唯讀儲存區

const修飾指標 

const  int* p; 

int const  * p;      //p可變,p指向的內容不可變

int * const p;       //p不可變,p指向的內容可變

const int * const p; //p和p指向的內容都不可以變

左數右指

當const出現在*的左邊時指標指向的資料為常量

當const出現在*的右邊時指標本身為常量

const 修飾函式引數和返回值

const 修飾函式引數表示在函式體內不希望改變引數的值

const 修飾函式返回值表示返回值不可改變,多用於返回指標的情形

volatile 可理解為 "編譯器警告指示"

volatile 用於告訴編譯器必須每次去記憶體中讀取

變數值

volatile 主要修飾可能被多個執行緒訪問的變數

volatile 也可修飾可能被未知因數更改的變數

小結auto變數儲存在程式的棧中,預設屬性

static變數儲存在程式靜態區

register變數請求儲存於cpu暫存器中

extern變數在檔案其它地方分配空間

extern能夠指示編譯器按照標準c方式編譯程式

const變數具有唯讀屬性

const不能定義真正意義上的常量

const將具有全域性生命週期的變數儲存於唯讀儲存區

volatile強制編譯器減少優化,必須每次去記憶體中取值

c中的關鍵字

一 register 作用 請求編譯器盡可能的將變數存在cpu內部暫存器中,一般的變數存在記憶體中,當需要時cpu再從記憶體中把它抓取到cpu中,使用register把它存在cpu中省去了cpu從記憶體中抓取資料的時間,提高執行效率。注意 1 盡可能,因為cpu記憶體有限,不可能全放在裡面,一般把頻...

C 中struct關鍵字和class關鍵字的區別

剛開始接觸 c 看到 中有struct關鍵字,還以為是用了結構體,結果後來發現 struct 和 class 一樣都用於類的定義,於是把兩者的差別記錄於此。一句話總結 兩者均可用於定義類,唯一的區別是兩者定義的類的預設訪問許可權有差別。其實比兩者差別更重要的是,我很好奇為什麼 c 中會存在兩個用於定...

c 中mutable關鍵字

mutalbe的中文意思是 可變的,易變的 跟constant 既c 中的const 是反義詞。在c 中,mutable也是為了突破const的限制而設定的。被mutable修飾的變數,將永遠處於可變的狀態,即使在乙個const函式中。我們知道,如果類的成員函式不會改變物件的狀態,那麼這個成員函式一...