陳正衝老師講c語言之const關鍵字

2022-05-10 10:20:08 字數 2623 閱讀 6259

1.const 關鍵字也許該被替換為 readolny

const是constant的縮寫,是恆定不變的意思,也翻譯為常量、常數等。很不幸,正是因為這一點,很多人都認為被const修飾的值是常量。這是不精確的,精確的說應該是唯讀的變數,其值在編譯時不能被使用,因為編譯器在編譯時不知道其儲存的內容。或許當初這個關鍵字應該被替換為readonly。那麼這個關鍵字有什麼用處和意義呢?

const推出的初始目的,正是為了取代預編譯指令define,消除它的缺點,同時繼承它的優點。我們看看它與define巨集的區別。(很多人誤以為define是關鍵字,在這裡我提醒你再回到本章前面看看32個關鍵字裡是否有define)。

2.const 修飾的唯讀變數

定義const唯讀變數,具有不可變性。

例如:

const int max=100;

intarray[max];

這裡請在visual c++6.0裡分別建立.c檔案和.cpp檔案測試一下。你會發現在.c檔案中,編譯器會提示出錯,而在.cpp檔案中則順利執行。為什麼呢?我們知道定義乙個陣列必須指定其元素的個數。這也從側面證實在c語言中,const修飾的max仍然是變數,只不過是唯讀屬性罷了;而在c++裡,擴充套件了const的含義,這裡就不討論了。

注意:const修飾的唯讀變數必須在定義的同時初始化,想想為什麼?

留乙個問題:case語句後面是否可以是const修飾的唯讀變數呢?請動手測試一下。

3.節省空間,避免不必要的記憶體分配,同時提高效率

編譯器通常不為普通const唯讀變數分配儲存空間,而是將它們儲存在符號表中,這使得它成為乙個編譯期間的值,沒有了儲存與讀記憶體的操作,使得它的效率也很高。

例如:

#define m 3 //巨集常量

const int n=5; //此時並未將n放入記憶體中

......

int i=n; //此時為n分配記憶體,以後不再分配!

int i=m; //預編譯期間進行巨集替換,分配記憶體

int j=n; //沒有記憶體分配

int j=m; //再進行巨集替換,又一次分配記憶體!

const定義的唯讀變數從彙編的角度來看,只是給出了對應的記憶體位址,而不是象#define一樣給出的是立即數,所以,const定義的唯讀變數在程式執行過程中只有乙份拷貝(因為它是全域性的唯讀變數,存放在靜態區),而#define定義的巨集常量在記憶體中有若干個拷貝。

#define巨集是在預編譯階段進行替換,而const修飾的唯讀變數是在編譯的時候確定其值。

#define巨集沒有型別,而const修飾的唯讀變數具有特定的型別。

4.修飾一般變數

一般常量是指簡單型別的唯讀變數。這種唯讀變數在定義時,修飾符const可以用在型別說明符前,也可以用在型別說明符後。例如:

int const i=2; 或 const int i=2;

5.修飾陣列

定義或說明乙個唯讀陣列可採用如下格式:

int const a[5]=;或

const int a[5]=;

6.修飾指標

const int *p; // p可變,p指向的物件不可變

int const *p; // p可變,p指向的物件不可變

int*const p; //p不可變,p指向的物件可變

const int *const p; //指標p和p指向的物件都不可變

在平時的授課中發現學生很難記住這幾種情況。這裡給出乙個記憶和理解的方法:

先忽略型別名(編譯器解析的時候也是忽略型別名),我們看const離哪個近。「近水樓台先得月」,離誰近就修飾誰。

const int*p; //const修飾*p,p是指標,*p是指標指向的物件,不可變

intconst *p;//const修飾*p,p是指標,*p是指標指向的物件,不可變

int*constp;//const修飾p,p不可變,p指向的物件可變

const int*constp; //前乙個const修飾*p,後乙個const修飾p,指標p和p指向的物件都不可變

7.修飾函式的引數

const修飾符也可以修飾函式的引數,當不希望這個引數值被函式體內意外改變時使用。例如:

void fun(const int i);

告訴編譯器i在函式體中的不能改變,從而防止了使用者的一些無意的或錯誤的修改。

8.修飾函式的返回值

const修飾符也可以修飾函式的返回值,返回值不可被改變。例如:

const int fun (void);

在另一連線檔案中引用const唯讀變數:

extern const int i; //正確的宣告

extern const int j=10; //錯誤!唯讀變數的值不能改變。

注意這裡是宣告不是定義,關於宣告和定義的區別,請參考其他資料。

參考:陳正衝老師的《

c語言深度剖析

》。

陳正衝老師對於c語言野指標的解釋

那到底什麼是野指標呢?怎麼去理解這個 野 呢?我們先看別的兩個關於 野 的詞 野孩子 沒人要,沒人管的孩子 行為動作不守規矩,調皮搗蛋的孩子。野狗 沒有主人的狗,沒有鍊子鎖著的狗,喜歡四處咬人。對付野孩子的最好辦法是給他定一套規矩,好好管教。一旦發現沒有按規矩辦事就好好收拾他。對付野狗最好的辦法就是...

陳正衝 C語言深度剖析 p89詳解

int p int 0x12ff 7c 我的編譯器分配的記憶體位址 p null 在執行完第二條 之後,發現p的值變為0x00000000了。我們都知道給指標指向的空間賦值,不會改變指標的值。難道這個結論有錯,我繼續試了下。int i 10 int p int 0x12ff7c p null 此時指...

C語言之旅(4)const

在c語言中,const宣告的變數是唯讀變數,並不等同於常量。const和define的區別是什麼?1.對於define巨集,在c語言中是單純的替換。在預編譯階段就是完成全量替換操作,並不檢查對錯。2.而const,程式在編譯的時候會檢查const的型別,如果不對的話,編譯會報錯。3.const可以保...