請問分析以下幾個定義:
const char* p1; char const* p2; char* const p3; const char** p4; char const** p5; char* const* p6; char** const p7;
90%的人前三個沒問題。而後面幾個估計很多人都會繞糊塗了。本人查過一些資料(包括網上的和書本的),但是個人感覺那些資料對於const的作用、const指針和指向const值的指針的解讀略有欠缺且稍顯繁亂。因而本人本著拋磚引玉的目的寫下這篇筆記,歡迎大家指教和討論。
const關鍵字的作用可以概括為:將其右邊第一個符號限定為constant。這裡的符號定義為:數據類型[*]或者是[*]變量名或*(方括號表示可選)。在定義(聲明)某個變量的時候,如果變量名被修飾為constant,則需要在定義(聲明)的時候賦值。根據上這一理論,p1~p7為變量名。char* const p3中,const修飾p3,p3在定義的時候必須賦值;const char** p4中,const修飾char*,*p4指向const char*,*p4在定義的時候不需賦值;其它幾個同理。
《C專家編程》第19頁倒數第二段說:
要使賦值形式合法,必須滿足下列條件之一:兩個操作數都是指向有限定符或無限定符的相容類型的指針,左邊指針所指向的類型必須具有右邊指針所指向類型的全部限定符。
也就是說,在賦值的時候,要麼兩邊具有相同的限定性且是相容類型,要麼左邊的限定性比右邊的多。結合上一部分const的作用,我們知道const char** 和char**是不相容的類型,不能相互賦值。