編譯器通常不為普通const 唯讀變數分配儲存空間,而是將它們儲存在符號表中,這使得它成為乙個編譯期間的值,沒有了儲存與讀記憶體的操作,使得它的效率也很高。
例如:#define a 3 //乙個巨集常量
const int b=5; //此時並未將b 放入記憶體中
int i=b; //此時為b 分配記憶體,以後不再分配!
int i=a; //預編譯期間進行巨集替換,分配記憶體
int j=b; //沒有記憶體分配
int j=a; //再進行巨集替換,又一次分配記憶體!
const 定義的唯讀變數從彙編的角度來看,只是給出了對應的記憶體位址,而不是象#define一樣給出的是立即數,所以,const 定義的唯讀變數在程式執行過程中只有乙份拷貝(因為它是全域性的唯讀變數,存放在靜態區),而#define 定義的巨集常量在記憶體中有若干個拷貝。#define 巨集是在預編譯階段進行替換,而const 修飾的唯讀變數是在編譯的時候確定其值。#define 巨集沒有型別,而const 修飾的唯讀變數具有特定的型別。
const修飾一般常量時:
一般常量是指簡單型別的唯讀變數。這種唯讀變數在定義時,修飾符const 可以用在型別說明符前,也可以用在型別說明符後。例如:int const a=2; 或const int a=2;
const修飾陣列時:
定義或說明乙個唯讀陣列可採用如下格式:
int const n[3]=;或const int n[3]=;
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修飾函式的引數時:
const 修飾符也可以修飾函式的引數,當不希望這個引數值被函式體內意外改變時使用。
例如:void aaa(const int n);
告訴編譯器a在函式體中的不能改變,從而防止了使用者的一些無意的或錯誤的修改。
const修飾函式的返回值時:
const 修飾符也可以修飾函式的返回值,返回值不可被改變。例如:
const int aaa (void);
在另一連線檔案中引用const 唯讀變數:
extern const int n; //正確的宣告
extern const int m=1; //錯誤!唯讀變數的值不能改變。
注意這裡是宣告不是定義。
轉換成const 細談c 的const
c const關鍵字小結 const 是constant的縮寫,本意是不變的,不易改變的意思。const 在c 中是用來修飾內建型別變數,自定義物件,成員函式,返回值,函式引數。1 c語言的const特點 const int a 10 不要把a看成常量 a的本質 是變數 只是 唯讀變數 c語言的co...
轉換成const 細談c 的const
c const關鍵字小結 const 是constant的縮寫,本意是不變的,不易改變的意思。const 在c 中是用來修飾內建型別變數,自定義物件,成員函式,返回值,函式引數。1 c語言的const特點 const int a 10 不要把a看成常量 a的本質 是變數 只是 唯讀變數 c語言的co...
細談陣列指標
陣列指標,指標陣列是學習指標和陣列最讓人頭疼的名詞,下面是學習分享,不足之處,望指正,相互學習!直接上 以下是在32位作業系統中編譯執行 include void main void int array 3 4 定義乙個指向int型的array二維陣列 int ptr 4 null 定義乙個指向占有...