C/C++指針詳解之一

       網上很多人已經寫過關於指針用法文章,對於指針,我結合一些具體的實例,寫一點自己的看法。

第一篇:const int * p和int * const p

       這個問題是老生常談的問題,但我還是有很多人到真正使用的時候就犯迷糊,希望看過如下的解釋,能夠徹底明白。

       首先,我們要牢記一點:const在*前是修飾指針所指向的變量,const在*之後是修飾定義的指針本身。

       const本身起到的修飾作用是“常量”。例如const int *p,const修飾的是*p,也就是指針p所指向的值必須是個常量;而int * const p,const修飾的是指針p本身,也就是指針p必須是個常量。請看例子example01和example02:

  1. /*VC++6.0 IDE*/
  2. //example01
  3. int main(int argc, char* argv[])
  4. {
  5.        int a = 12;
  6.        const int * p = &a;
  7.        *p = 0;   //將指針p指向的值修改爲0,編譯會報錯:error C2166: l-value  specifies const object
  8.        return 0;
  9. }
//example02 int main(int argc, char* argv[]) {        int a = 12;        int b = 10;        int * const p = &a;        *p = 0;   //正確        p = &b;  //將指針p本身的值修改爲&b,編譯會報錯: error C2166: l-value specifies const object       return 0; }

         通過上面的例子,可以看到const修飾的作用。但是是不是const int *p定義的指針p指向的值永遠不能改變?否!請看下面例子:

  1. /*VC++6.0 IDE*/
  2. //example03
  3. int main(int argc, char* argv[])
  4. {
  5.     int a = 12;
  6.     const int * p = &a;
  7.     //*p = 0;   //將指針p指向的值修改爲0,編譯會報錯:error C2166: l-value  specifies const object 
  8.     a = 0;       //不能通過*p = 0來修改p指向的值,但是可以通過這樣的方法進行修改
  9.     cout << *p << endl;  //打印出0
  10.     return 0;
  11. }
  1. 而int * const p定義的指針p本身的值也不可以改變呢?是的。一旦初始化賦予a的址值,此時int * const p中的指針p本身值就再也不能改變了。
  1.  經過上面一番周折,現在可以很容易理解const int * const p的意思了吧。它定義的是一個指向常量值的常量指針。我想我也不必多費口舌了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章