先看一段代碼:
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: