const int*和int const*

 

先看一段代碼:

  1: char greeting[] = “Hello”;
  2: char* p = greeting; //non-const pointer,non-const data
  3: const char* p = greeting; //non-const pointer,const data;
  4: char* const p = greeting;//const pointer,non-const data;
  5: const char* const p = greeting; //const pointer,const data;
  6: 

關於定義的閱讀,一直以爲這段解釋很不錯了已經,即以*和const的相對位置來判斷:

const語法雖然變化多端,但並不莫測高深。如果關鍵字const出現在*左邊,表示被指物是常量;如果出現在*右邊,表示指針自身是唱兩句;如果出現在*兩邊,表示被指物和指針兩者都是常量。

如果被指物是常量,有些程序員會將關鍵字const寫在類型之前,有些人會把它寫在類型之後、*之前。兩種寫法的意義相同,所以下列兩個定義相同:

  1: const Widget* w;
  2: Widget const* w;

後來在百度知道上看到另一段挺有意思的解釋:

其實很簡單,const和*的優先級相同

且是從右相左讀的,即“右左法則”

其實const只是限定某個地址存儲的內容不可修改

比如int*p;讀作p爲指針,指向int,所以p爲指向int的指針

int*const p;讀作p爲常量,是指針,指向int,所以p爲指向int的常量指針, p不可修改

int const *p;p爲指針,指向常量,爲int,所以p爲指向int常量的指針, *p不可修改

int ** const p; p爲常量,指向指針,指針指向int,所以p爲指向int型指針的常量指針,p不可修改

int const**p; p爲指針,指向指針,指針指向常量int,所以p爲指針,指向一個指向int常量的指針, **p爲int,不可修改

int * const *p ; p爲指針,指向常量,該常量爲指針,指向int,所以p爲指針,指向一個常量指針,*p爲指針,不可修改

int ** const *p; p爲指針,指向常量,常量爲指向指針的指針,p爲指針,指向常量型指針的指針,*p爲指向指針的指針,不可修改

int * const **p; p爲指針,指向一個指針1,指針1指向一個常量,常量爲指向int的指針,即p爲指針,指向一個指向常量指針的指針, **p爲指向一個int的指針,不可修改

如果在STL裏面使用迭代器來模擬同樣情況的話:

  1: std::vector<int> vec;
  2: 
  3: …
  4: 
  5: const std::vector<int>::iterator iter = vec.begin()//iter just like a T* const
  6: 
  7: *iter = 10;//OK,change the item pointed to
  8: 
  9: ++iter;//Wrong,iter is const
 10: 
 11: std::vector<int>::const_iterator cIter = vec.begin()//iter acts like a const T*
 12: 
 13: *cIter = 10;//Wrong,*cIter is const
 14: 
 15: ++cIter;//Ok. 
 16: 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章