我無法完全理解取消參考運算子的性質。取消參考只是指向變數的別名還是獲取變數的值。
我們知道,對于常量做&constant是無效的,因為常量沒有自己的記憶。
現在假設我們有這樣的東西-
int i=5;
int *ptr=&i;
然后,如果我們這樣做,&(*ptr)那么它將如何在較低級別發生?
我腦子里有兩三件事讓我帶你去看看。
案例 1:我讀到它*ptr給出了該記憶體位置的值,因此考慮 到這一&(*ptr)點將評估為&5 ,但這會給出錯誤,因為 5 是一個常數。
情況 2:這*ptr只是變數“i”的別名,然后&(*ptr)將變為&i,這對我來說看起來不錯。
案例3:我被告知&并*在運算式中相互抵消&(*ptr)但我無法得到它。它們是如何相互抵消的?
uj5u.com熱心網友回復:
在 C 標準中:
A.7.4.3 間接運算子一元 * 運算子表示間接,并回傳其運算元指向的物件或函式。如果運算元是指向算術、結構、聯合或指標型別的物件的指標,則它是左值。如果運算式的型別是“指向 T 的指標”,則結果的型別是 T。
因此,*ptr將回傳一個左值而不是存盤在其中的值i(因此,說它回傳一個別名是正確的)。運算子可用于此左值,您會得到與using&相同的結果。&i&(*ptr)
所以,情況2
并且,正如我們在上面看到的那樣,這樣說&并*相互抵消,&(*ptr)將評估到與&iwhich 相同的結果 just ptr。所以,最終的結果,你可以說,他們互相取消了。但是,除非編譯器決定進行一些優化并洗掉&and ,否則*首先*ptr會評估然后&對結果進行操作。
uj5u.com熱心網友回復:
它確實是第二種情況。作為指向本地堆疊變數的指標,&(*ptr)它將獲得它的地址。
常量變數確實以與非常量相同的方式具有它們的記憶。但是,如果它不以這種方式對其記憶體地址進行操作,優化器可能會將其分割出來并就地放置常量值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/456452.html
上一篇:關于C結構中的記憶體管理的查詢
