天天看點

面試點:關鍵字const(C語言面試題分析之四)一. const聲明的變量隻能被讀二.必須初始化三.如何在另一.c源檔案中引用const常量四. 可以進行類型檢查五.可以避免不必要的記憶體配置設定六.可以通過函數對常量進行初始化七.是不是const的常量值一定不可以被修改呢?八.如何厘清數值常量和指針常量:

面試點:關鍵字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;                 //合法

繼續閱讀