const應該是單詞constant的縮寫,意思是永恆的不變的。const這個關鍵字用得到的地方很多,用的方式也很多,因此讓人疑惑的地方也比較多,今天做個總結。
const int a;
int const a;
都是把a常量化了,告訴大家不要修改a的值,如果你非要修改a的值
const int a = 10;
int *p = (int*)&a;
*p = 111;
用這種方式也是可以的,但是const就是告訴你這個值是不要修改也是不用修改的,所以我們還是要遵守這種道德規範。
//修飾的是*p,說明*p是不可變的,也就是說p這個指標可以指向別的地方,但是指向的值不可以修改
const int *p;
int const *p;
//修飾的是p,p是乙個指標,也就是說p指向**是不能變的,但是指向的位置的值可以修改
int *const p;
//p既是乙個常量指標,而且指向乙個常量
const int *const p;
嗯,其實也不是很複雜,主要要分清楚const修飾限定的是哪個,是被看作整體的整型變數*p還是單獨的整型指標p,修飾p那麼p就是常量指標,不能再被修改,但是指標指向的值沒被修飾,仍然是變數;修飾*p那*p就是常量不能再修改,但是指標仍然是變數,可以被修改;當然還有第四條,常量指標指向常量,都被const限定了;還有就是 const int 和 int const 其實是一樣的。
下面有幾個例子
const char *p = "wangchengmeng";//宣告乙個字串常量,但是p依然可以指向別的字串
*p = "chengmengwang"; //非法操作
char *a = "chengmengwang";
p = a ; //合法操作
這樣宣告也可以
const char p = "wangchengmeng";
int main(const int argc, char *const ar**);
//char *const ar**; ar**是乙個字串指標的陣列,被const限定之後就成為了
//常量字串指標的陣列,這個陣列中儲存的字串指標是常量,不能被修改,但是字串指標指向的值
//可以被修改
char *a="wangchengmeng";
ar**[0] = a;//非法
*ar**[0] = *a;//合法
以下內容** 寫的很好,我就直接拿來用了,不重新寫了
3、全域性變數。
我們的原則依然是,盡可能少的使用全域性變數。
我們的第二條規則 則是,盡可能多的使用const。
如果乙個全域性變數只在本檔案中使用,那麼用法和前面所說的函式區域性變數沒有什
麼區別。
如果它要在多個檔案間共享,那麼就牽扯到乙個儲存型別的問題。
有兩種方式。
1.使用extern
例如/* file1.h */
extern const double pi;
/* file1.c */
const double pi=3.14;
然後其他需要使用pi這個變數的,包含file1.h
#include file1.h
或者,自己把那句宣告複製一遍就好。
這樣做的結果是,整個程式鏈結完後,所有需要使用pi這個變數的共享乙個儲存區域。
2.使用static,靜態外部儲存類
/* constant.h */
static const pi=3.14;
需要使用這個變數的*.c檔案中,必須包含這個標頭檔案。
前面的static一定不能少。否則鏈結的時候會報告說該變數被多次定義。
這樣做的結果是,每個包含了constant.h的*.c檔案,都有乙份該變數自己的copy,
該變數實際上還是被定義了多次,占用了多個儲存空間,不過在加了static關鍵字
後,解決了檔案間重定義的衝突。
壞處是浪費了儲存空間,導致鏈結完後的可執行檔案變大。但是通常,這個,小小
幾位元組的變化,不是問題。
好處是,你不用關心這個變數是在哪個檔案中被初始化的。
最後,說說const的作用。
const 的好處,是引入了常量的概念,讓我們不要去修改不該修改的記憶體。直接的
作用就是讓更多的邏輯錯誤在編譯期被發現。所以我們要盡可能的多使用const。
但是很多人並不習慣使用它,更有甚者,是在整個程式 編寫/除錯 完後才補
const。如果是給函式的宣告補const,尚好。如果是給 全域性/區域性變數補const,那
麼……那麼,為時已晚,無非是讓**看起來更漂亮了。關於const的使用,曾有一
個笑話說,const 就像安全套,事前要記牢。如果做完後才想起來該用而忘了用,
呵呵……呵呵……
C 專題 const那點事兒
目錄限定符const是老生常談的話題了,不管是面試還是平時工作都會經常遇到,你真的對它了解了麼?我這裡主要是從三個維度進行總結,並進行例項驗證。const修飾內建型別 以下兩種表達是等價的 const int a 0 int const b 1 a 1 不允許,編譯報錯 b 2 不允許,編譯報錯co...
C 的那點事兒
一 預處理 定義 在編譯之前所做的處理,主要包括 標頭檔案 預處理會展開 巨集定義 預處理會替換掉 條件編譯 二 標頭檔案 作用 將一些公用 如函式原型宣告,型別宣告,全域性變數宣告,巨集定義等,放到乙個檔案中,以提供跨工程 復用,減少 重複書寫。處理方式 內容展開 若標頭檔案中有遞迴包含逐級展開 ...
C語言那點事兒(基礎篇)
一 基本概念 1.程式 編寫程式的目的,無非是解決現實世界中的問題 計算機解決任何現實世界中問題的過程無外乎 輸入 處理 輸出 輸入 input 讓計算機獲得要處理的資料 處理 process 計算機按照問題的要求對輸入的資料進行計算 處理 輸出 output 計算機告訴使用者問題的答案 計算 處理...