面試點:關鍵字const
C語言面試題分析之四
const int i=5;
int j=0;
...
i=j; //非法,導緻編譯錯誤
j=i; //合法
const int i=5; //合法
const int j; //非法,導緻編譯錯誤
extern const int i; //合法
extern const int j=10; //非法,常量不可以被再次指派
用const方法可以使編譯器對處理内容有更多了解。
#define I=10
const long &i=10; /*說明:由于編譯器的優化,使
得在const long i=10時,i不被配置設定記憶體,而是已10直接代入
以後的引用中,以緻在以後的代碼中沒有錯誤,為達到說教效
果,特别地用&i明确地給出了i的記憶體配置設定。不過一旦你關閉所
有優化措施,即使const long i=10也會引起後面的編譯錯誤。*/
char h=I; //沒有錯
char h=i; //編譯警告,可能由于數的截短帶來錯誤指派。
#define STRING "abcdefghijklmn/n"
const char string[]="abcdefghijklm/n";
printf(STRING); //為STRING配置設定了第一次記憶體
printf(string); //為string一次配置設定了記憶體,以後不再配置設定
printf(STRING); //為STRING配置設定了第二次記憶體
printf(string);
由于const定義常量從彙編的角度來看,隻是給出了對應的記憶體位址,
而不是象#define一樣給出的是立即數,是以,const定義的常量在
程式運作過程中隻有一份拷貝,而#define定義的常量在記憶體中有
若幹個拷貝。
int value();
const int i=value();
假定對ROM編寫程式時,由于目标代碼的不可改寫,本語句将會無效,不過可以變通一下:
const int &i=value();
隻要令i的位址處于ROM之外,即可實作:i通過函數初始化,而其
值有不會被修改。
觀察以下一段代碼:
const int i=0;
int *p=(int*)&i;
*p=100;
通過強制類型轉換,将位址賦給變量,再作修改即可以改變const常量值。
int ii=0;
const int i=0; //i是常量,i的值不會被修改
const int *p1i=&i; //指針p1i所指内容是常量,可以不初始化
int * const p2i=ⅈ //指針p2i是常量,所指内容可修改
const int * const p3i=&i; //指針p3i是常量,所指内容也是常量
p1i=ⅈ //合法
*p2i=100; //合法