你可以在期望一個const T型別指標的地方使用指向T型別的指標。
比如,下面的程式碼編譯是可以透過的。
但是請注意,這一規則,或者說一個顯式的例外,允許指標型別中的輕微不匹配,是不允許遞迴地應用,
只可以在最頂層(top level)。所以對於const char**,它是一個指向常量的指標的指標,不可以應用上面這一規則。
不允許將一個char**型別的值,賦值給一個const char**型別的指標,可以說原因有些模糊。
const限定符存在時,編譯器將幫助您保證常量不被修改。這就是為什麼你可以將一個char*型別賦值給const char*型別,但是反過來就不行。
假定你將執行下面一系列的賦值操作:
在第三行,將一個char**型別賦值給const char**型別(編譯器會報錯)。
在第四行,將一個const char*型別(&c)賦值給const char* (*p2)型別,這是合法的.
在第五行,修改一個char*型別的指標,這理應合法的。但是p1指向c,而c是一個const char型別。你會發現在第四行*p2實際上就是p1,因為透過第三行的操作,p2指向了p1
到這裡你會明白,為什麼第三行的賦值操作是非法的。如果第三行操作合法,將會導致第五行的結論。
將char**型別的賦值給const char**型別,不會導致直接的危險。但是正如上面的推導,它會產生一種情形-p2最終所指向的值不能被修改,這一宣告不滿足。
在C語言中,如果你必須將限定符不相容的指標賦值給非第一級間接使用,則必須使用顯式強制型別轉換。然而,需要做這樣的型別強制轉換可能意味這背後隱藏著更深的問題,只是這個強制型別轉換並不能解決這個問題。
你可以在期望一個const T型別指標的地方使用指向T型別的指標。
比如,下面的程式碼編譯是可以透過的。
但是請注意,這一規則,或者說一個顯式的例外,允許指標型別中的輕微不匹配,是不允許遞迴地應用,
只可以在最頂層(top level)。所以對於const char**,它是一個指向常量的指標的指標,不可以應用上面這一規則。
不允許將一個char**型別的值,賦值給一個const char**型別的指標,可以說原因有些模糊。
const限定符存在時,編譯器將幫助您保證常量不被修改。這就是為什麼你可以將一個char*型別賦值給const char*型別,但是反過來就不行。
假定你將執行下面一系列的賦值操作:
在第三行,將一個char**型別賦值給const char**型別(編譯器會報錯)。
在第四行,將一個const char*型別(&c)賦值給const char* (*p2)型別,這是合法的.
在第五行,修改一個char*型別的指標,這理應合法的。但是p1指向c,而c是一個const char型別。你會發現在第四行*p2實際上就是p1,因為透過第三行的操作,p2指向了p1
到這裡你會明白,為什麼第三行的賦值操作是非法的。如果第三行操作合法,將會導致第五行的結論。
將char**型別的賦值給const char**型別,不會導致直接的危險。但是正如上面的推導,它會產生一種情形-p2最終所指向的值不能被修改,這一宣告不滿足。
在C語言中,如果你必須將限定符不相容的指標賦值給非第一級間接使用,則必須使用顯式強制型別轉換。然而,需要做這樣的型別強制轉換可能意味這背後隱藏著更深的問題,只是這個強制型別轉換並不能解決這個問題。