變數屬性
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函式中。我們知道,如果類的成員函式不會改變物件的狀態,那麼這個成員函式一...