在c程序中,咱們可能常常會使用到指針之間的賦值。ui
傳統的賦值操做:spa
char *cp = "c"; const char *ccp; ccp = cp; printf("*ccp:%c",*ccp);
會正常打印出*cpp所指的字符。可是下面的這段代碼,就會出現問題:指針
char **c = &cp; const char **cc; cc = c; printf("**cc:%c",**cc);
編譯的時候提示,出現錯誤:code
1>------ 已啓動生成: 項目: oj1511, 配置: Debug Win32 ------ 1>生成啓動時間爲 2014/4/9 10:48:22。 1>InitializeBuildStatus: 1> 正在建立「Debug\oj1511.unsuccessfulbuild」,由於已指定「AlwaysCreate」。 1>ClCompile: 1> oj1510.cpp 1>e:\workspace\oj1511\oj1511\oj1510.cpp(11): error C2440: 「=」: 沒法從「char **」轉換爲「const char **」 1> 轉換丟失限定符 1> 1>生成失敗。 1> 1>已用時間 00:00:00.36 ========== 生成: 成功 0 個,失敗 1 個,最新 0 個,跳過 0 個 ==========
這是爲何呢?blog
原來仍是const修訂符搞的怪:it
第一段代碼中:編譯
cp是一個指向char類型的指針。class
ccp是一個const修飾符修飾的指向char類型的指針,也就是說,它指向的是char類型,可是指針自己是不可修改的。配置
在ANSI C標準中,有這麼一段:bug
兩個操做數都是指向有限定符或無限定符的相容類型的指針,左邊的指針所指向的類型必須具備右邊的所有限定符。
也就是說: ccp是一個指向有const修飾符的指針,cp是一個指向沒有const修飾符的指針。ccp中包含了cp的全部修飾符(其實cp就沒啥修飾符),所以能夠進行賦值。
這樣,咱們看一下面的代碼:
c是一個指向char類型指針的指針。
cc是一個指向const修飾符修飾的char類型的指針的指針。
cc 與 c指向的內容並不相同,所以沒法進行賦值操做。所以出現提示錯誤:error C2440: 「=」: 沒法從「char **」轉換爲「const char **」