如果我們取消引用整數指針,例如*(int *)
,因爲我們知道整數指針在64位平臺中支配8字節。但64位平臺中仍然需要4個字節的整數。取消引用64位平臺上的整數指針
如果我想取消引用其內存開始包含另一個指針地址的指針,該怎麼辦。所以實際上我想取第8個字節的值。將取消引用*(int *)獲取4字節或8字節?我認爲它應該是4個字節,因爲整數是4個字節。但我怎麼能得到64位平臺的8字節?而不知道該平臺是32位還是64位。
如果我們取消引用整數指針,例如*(int *)
,因爲我們知道整數指針在64位平臺中支配8字節。但64位平臺中仍然需要4個字節的整數。取消引用64位平臺上的整數指針
如果我想取消引用其內存開始包含另一個指針地址的指針,該怎麼辦。所以實際上我想取第8個字節的值。將取消引用*(int *)獲取4字節或8字節?我認爲它應該是4個字節,因爲整數是4個字節。但我怎麼能得到64位平臺的8字節?而不知道該平臺是32位還是64位。
讓我們做一些事情說清楚(這些都是獨立的平臺,但在大多數情況下),如果你的系統上:
sizeof(int) is 4 bytes
sizeof(int*) is 4 on 32bit and 8 on 64bit
sizeof(int**) is 4 on 32bit and 8 on 64bit
當你解引用一個int*
,你提取int
。原始的int*
可能是64位的8個字節,但您將從32位或64位系統獲得4個字節。
當您取消引用int**
時,您正在提取一個int*
。原始int**
可能是32位的4個字節或64位的8個字節,但是您將從32位系統獲取4個字節,並從64位系統獲取8個字節,因爲您正在提取int*
。
我不確定我是否理解你的問題,但實際上我認爲你根本沒有問題,因爲編譯器會自動爲你處理字的大小,爲每個平臺生成正確的代碼。因此,讓我們假設你調用返回一個指針的指針爲int的函數:如果取消引用這個指針,你會得到一個指向一個int,這將有每個平臺上適當的大小
int** ppiValue = SomeFunction();
:
int* piValue = *ppiValue;
這將在64位處理器上爲8個字節,在32位處理器上爲4個字節。編譯器負責爲所選目標平臺選擇合適的大小。現在讓我們對這個指針進行解引用:
int iValue = *piValue;
這將是兩個處理器上的4字節值。編譯器再次負責生成適當的機器代碼指令。
所以不要打擾 - 只要你依賴強類型,並且不使用危險的類型轉換,編譯器會照顧低級間接的細節。
這有點難以遵循。你能給我們一個小的代碼片段作爲例子嗎? – litelite
如果「內存開始包含另一個指針地址」,則需要通過指向指針的指針取消引用,而不是指向int的指針。如果某個地址處的「東西」是另一個地址,那麼指向指針的指針是唯一合理的途徑(最終通過*)到達它。所有這一切說,這有一個[XY問題]幾乎壓倒性的辛辣氣味(https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。你真的在做什麼,你是如何得到這個動物園作爲解決它的機制的? – WhozCraig
如果你試圖強制使用8個字節,你可以使用'int64_t'而不是'int' – MikeChav