C語言中,const限定詞指定了一個不可修改的變量,但並不是常量。它可以使編譯器幫助我們保證某些變量不被意外修改,例如指針或引用傳遞時,加上const可保證我們的源數據不被破壞。const修飾指針時情況比一般情況下要復雜許多,先看下面這個例子:
1 const char * p1;//p1指向的內容不可變
2 char const * p2;//p2指向的內容不可變
3 char * const p3;//p3不可變,但其指向的內容可變
通過注釋可以看出,當const在*前時,其修飾的是指針指向的內容,但指針本身是可變的,我們可以用它來遍歷一個源數組或其他一組不想被意外破外的數據;當const在*後時,其修飾的是指針本身,但其指向的內容是可變的,在這個意義上,它類似於數組名,但二者並不完全等價。
在任何情況下,都可以向const T類型的指針傳入T型的指針(T表示任意數據類型),但反過來卻不行。原因很簡單,如果反來過可行,我們就可以借助普通指針來修改const型指針指向的 內容,這恐怕不是我們想要的結果。但是這條規則是否適用於const修飾的二級指針呢?比如給const char **的指針傳入一個char **的值,會不會保證萬無一失呢?這種情況下編譯器一般會給出一個warning,曾以為這個warning是無關緊要的,只是編譯器太敏感了,只到後來 看來這個例子,我才仿佛明白了什麼:
1 const char c ='x';
2 char *p1;
3 const char **p2 = p1;//用char **的值賦給const char **
4 *p2 = &c;//用const char * 給const char *賦值,完全沒問題
5 *p1 = 'y';//給char *指向的內容賦值,沒問題!但這兒會發生什麼事情
除了第3行出有一個warning外,其余的都沒任何問題,但是經過第4步的操作,p1已經指向的c,這是一個不可修改的變量,第5步!!!天哪,我干了些什麼??
本文出自 “學須靜也” 博客