C語言關於const的那點事兒

2021-09-16 20:48:21 字數 2456 閱讀 5828

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 計算機告訴使用者問題的答案 計算 處理...