const 修飾的唯讀變數必須在定義的同時初始化
編譯器通常不為普通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 修飾的唯讀變數具有特定的型別。
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 是指標指向的物件,不可變
int const *p; //const修飾*p,p 是指標,*p 是指標指向的物件,不可變
int *const p; //const修飾p,p 不可變,p 指向的物件可變
const int *const p; //前乙個const 修飾*p,後乙個const 修飾p,指標p 和p 指向的物件
都不可變
修飾函式的引數
const 修飾符也可以修飾函式的引數,當不希望這個引數值被函式體內意外改變時使
用。例如:
void fun(const int i);
告訴編譯器i 在函式體中的不能改變,從而防止了使用者的一些無意的或錯誤的修改。
修飾函式的返回值
const 修飾符也可以修飾函式的返回值,返回值不可被改變。例如:
const int fun (void);
const修飾的變數
const定義的常量不能直接被修改,只能間接被修改,如,通過指標。int main const int a 20 int p 10 指標變數指向的是a的位址,通過給指標變數p賦值來改變a中的值 printf d n a return 0 結果 10 在c語言中,當const修飾的識別符號,這個識別符...
const修飾的變數
1.const char p1 2.char const p2 以上兩種情況,到底哪種是指標不能變,哪種是變數不能變呢?下面做乙個記錄,防止以後出錯 記住一句口訣 左定值,右定向 如果const在 左邊,那麼定義的變數值不能改變,但指標是可以改變的 如果const在 右邊,方向即指標不能變,也就是這...
強行修改const唯讀變數
修改const唯讀變數,只能修改區域性常量,不能修改全域性靜態常量。例如 某函式內部 const int const value 100 int ptr int const value ptr 200 因為在函式內部宣告的 const value,其本質上還是乙個函式內的區域性變數,儲存區在該函式的...