【轉】C++易混知識點1: 指針常量和常量指針的區別,附有詳細案例解釋

熟悉C++也已經有一些年頭了,今天忽然翻出當年瀏覽的書籍,對一些概念竟然生疏了,指針常量和常量指針因爲 指針 這一特殊的對象而變得難以區別。
所以,在思考再三以後,決定寫下該篇總結,增強對他們的區別:

轉載請註明出處: http://blog.csdn.net/elfprincexu函數

1. 常量指針 (const __type__ *)spa


常量指針,一般形式是const位於*左側,C++primer定義爲底層const指針,咱們能夠這樣理解,常量指針覺得「常量的指針」,形容詞爲常量,指針爲名詞。也就是說它的本質仍是一個指針,只不過多了一個「常量的」修飾詞。 表示該指針指向一個常量。.net

  1. const int * p ;  // 常量整形指針,表面該指針指向一個整形常量。  
  2. int a =5;  
  3. const int *p = &a ;  // 合法,表面p指針指向一個爲5的整形常量a; 常量指針能夠指向很是量  
  4. *p = 6; // 錯誤,既然爲常量的指針,不能經過該指針修改它所指向的常量值  
  5. a = 6; // 合法,能夠經過原來的申明修改  

咱們經常使用的字符比較函數 strcmp就是一個很好的例子:指針

  1. int strcmp (const char* lhs, const char* rhs);  

代表該指針不能修改所指向的常量(理所固然,咱們只須要讀操做,不該該改變所指向的對象的值,設置常量指針保證了在函數內部,不能經過該指針去改變他所指向的對象的值,對保護原對象相當重要,我想之全部常量指針的出現,很大一部分用處在於此番考慮吧。對象

  1. const int * p2; // 合法,能夠定義時不初始化,  
  2. int b = 8;  
  3. p2 = &b ; // 合法,常量指針能夠變換指針所指向的地址,這一點和」指向常量「沒有衝突,因此  

總結: const 的位置在 * 左側 (C++ primer 定義爲底層const*), const 表示常量,該表達式表面常量指針,表面指針指向的對象是常量 !blog


2. 指針常量 (__type__ * const )it


const位於*右側(C++Primer 定義爲頂層const*), 指針常量, 能夠理解爲 「指針的」 類型常量, 本質是 一個常量, 和咱們一般說的整形常量相似, 本質是一個常量。因此常量在定義的時候必須初始化。io

  1. const int a;   // 非法,常量必須初始化  
  2. const int b = 5; // 合法,b爲5的常量  
  3. int * const p = &b; // 合法,必須給常量初始化,他的值是a的地址,指針常量,說明該常量是指針(地址)  
  4. *p = 10;    // 合法,雖然指針常量是個常量,它一旦初始化(地址給定)就不在改變,但沒有限制它所指向的對象的值得改變(改變對象的值依然指向該對象,指針值(地址)沒變)。  

總結: 指針常量,本質是個常量,const位於* 的右側,必須定義時給出初始化(地址),初始化以後不可改變(指針常量,指針固然不能變),可是能夠改變指針所指向的對象的值。變量

3. 指向常量的指針常量 (const __type__ * const)書籍


這個不容易搞錯,反正,兩個都有,兩個性質也都有,必須定義時初始化,而且不能改變指針所指向的對象的值。

  1. const int a = 8;  
  2. int b = 10;  
  3. const intconst p =&a;     //合法, 第一個const 表面是常量指針,指向常量,第二個const代表是指針常量,必須初始化  
  4. *p = 10; // 非法,常量指針不容許改變指針所指向的值  
  5.  p = &b;    // 非法,指針常量不容許在改變p的值(既然指向了a對象,不能再改變)  

總結: 兩個const 都有的狀況下,不易混淆。


const(*號)左邊放,我是常量指針,指向常量,能夠變向;

const(*號)右邊放,我是指針常量,指向變量,不可變向;

const(*號)兩邊放,我是常量指針常量,指向常量,不可變向;

相關文章
相關標籤/搜索