"*"的作用是引用指針指向的變數值,引用其實就是引用該變數的地址,“解”就是把該地址對應的東西解開,解出來,就像打開一個包裹一樣,那就是該變數的值了,所以稱為“解引用”。也就是說,解引用是返回記憶體地址中保存的值。
比如int a=10; int *p=&a;
cout<<*p<<endl; 輸出a的值,就是解引用操作。
詞語解釋,歷史,
詞語解釋
對於c語言中指針的操作符有兩個:&和*。對於&,好理解,翻譯的也不錯,就是“取地址”的意思。但對於*,翻譯為“解引用”,字面意思不好理解,即使看了後面內容才知道不過是“取指針指向的地址的內容”,也仍然是覺得怪怪的,“解引用”這個詞難記也難於從字面直接判斷意思,以致時間長了還是感覺像見了熟悉的陌生人。
翻了好多資料,以及各種網上解釋,大約有點意思了。依我的理解,約摸是這樣:
“引用”這個詞,出現最多的場景就是:在文章或者註腳里,寫上“引用(或摘自)某某作者某篇文章”,意思很明了,就是出現在本文的不是作者自己的話,而是別個作者的話,於是“引用”的意思就是拿過來用。(以下提到”場景“,就是指的這個例子)
歷史
國外資料出現的一詞“reference",應譯為”參考,參照“,在我們中文技術資料上翻譯為了”引用“,照上面說的那種場景,倒也可以理解的通。而”dereference“翻譯為”解除參照“,資料上翻譯為”解引用“,如果回到上面那種場景,那”解引用“或者”解除參照“就是:我們拿了(引用)別個作者的話,卻沒有註解(解除參照)說這是別人的話,實際上我認為”去引用化“也許更能表達這個過程或者這個意思。那么對應到C語言中,指針變數是存儲”其它變數“的地址的,當我們用”*“去操作指針時,我們的意思就是把那個”其它變數“的內容拿過來放在這裡,卻不說明這是別人(在這裡就是指針存儲的變數)的東西,當然這只是類比。過程差不多相似,只要能幫助理解,就阿彌陀佛了。於是”解引用“這樣來理解,貌似好多了。不知道大家懂我說的了沒?
網上查的”dereference“在技術資料上翻譯真是各種多阿,這裡不說了,反正其它翻譯也許更難理解。
翻譯別國資料,用詞真是難,畢竟兩種語言辭彙不一定完完全全的相對應。尤其技術資料,還要講究專業術語,翻譯成中文時,那是真的千挑萬選,才搞出一個像”專業術語“的辭彙來表達。現在國內作者翻譯水平參差不齊,加上對術語的創造,使得翻譯後的中文資料難於閱讀啊。比如上面的”解引用“就是一例。再說個”正則表達式“,從字面意思來看,完全不懂,或許看英文都比我們自己的中文好理解一點。但是純英文看的累,還慢,真是兩難啊。
還可以把“解引用”理解為“解碼”。假設ptr里存放的是一個記憶體地址,那么*ptr就是這個記憶體地址里存放的數據。前面這個“*”的解引用操作,就可以理解為對這個ptr進行解碼,解碼得到的數據就是*ptr,也就是我們常說的“這個記憶體地址里存放的數據”或者“這個指針指向的數據”。“指針”的理解模式太容易混淆,而“解碼”的理解模式更好記一點。