指標賦值時的相容性

2021-05-05 03:58:15 字數 984 閱讀 8464

這個標題不知道算不算確切,今天從《c專家程式設計》看起,然後發散到不知什麼地方去了,亂亂的看了一堆東西。還是先從《c專家程式設計》說起吧。

今天看了乙個開頭,主要是在1.9節的乙個問題。

foo(const char** p) {}

main(int argc, char ** argv)

會出現警告:引數和原型不匹配。也就是說char **和const char**是不相容的。可是char*和const char*是相容的啊。為什麼char*和const char*相容呢(這裡指char* p2可以給const char* p1賦值),原因是p1和p2所指向的物件都是char,這是相容的;p1帶有const而p2沒有,這也是相容的,因為它符合「指標間賦值左值要包含右值所有的限定詞」這條規則。但對於const char ** p1和char **p2來說,情況就不一樣了。雖然p1仍然符合「左值包含右值所有限定詞」規則,但p1所指向的物件是乙個指向const物件的指標,而p2所指向的物件卻是乙個指向非const物件的指標,兩者的型別不相容,因此p1=p2非法。

(引自:http://blog.csdn.net/megaboy/archive/2005/10/17/505927.aspx)

簡單的說就是const char* 和char* 這兩個指標型別不相容的。

相容的定義是什麼?網上看到乙個,覺得有道理:所謂型別相容,指的就是型別不同但系統可以自動進行轉換。也就是說系統不能把char*自動轉換為const char*。其實我覺得這個規定是挺奇怪的。char*和const char*兩個指標其實都沒有限定符,只是它們指向的物件有限定符,乙個指向char,乙個指向const char而已。

也就是說p1本質上指向的是乙個指標q1,p2本質上也指向乙個指標q2,都是指標嘛,為啥不相容。如果說不相容是因為q1和q2指向的物件不同,這明顯就矛盾了,char* q2和const char* q1顯然是相容的嘛。所以說,這個規定簡直就是奇怪的很。不知道定標準的人是啥出發點。

可見,不會有完美的標準,總會有些小問題的嘛。

相容性(空格相容性)

在chrome與firefox下顯示的寬度不同,原因是兩個瀏覽器的預設字型不同,給html規定字型即可解決。下面有各種形式的空格,各有不同 不換行空格,按下空格鍵所產生的空格,受字型影響明顯 ensp 半形空格 em寬度的一半 乙個小寫字母的寬度 基本不受字型影響 emsp 全形空格 乙個em寬度 ...

相容性小結

1.不同瀏覽器的標籤預設的外補丁和內補丁不同。解決 2.chorme瀏覽器下字型最小12px 解決 font size 12px webkit transform origin x 0 webkit transform scale 0.5833333333333334 scale 12 3.ie瀏覽...

程式相容性

版本可以提供各種不同形式的相容性 源 相容性,鏈結相容性,執行相容性,和程序相容性。這些都是根據c 程式建立各個過程命名的,1 如果沒有使用者需要重新編譯任何 那麼程式庫的版本n和版本m就具有源 相容性 2 如果沒有使用者需要重新編譯任何目標檔案,那麼版本n和版本m就具有鏈結相容性 3 如果沒有任何...