2017-08-04 49 views
0

如果我們取消引用整數指針,例如*(int *)
,因爲我們知道整數指針在64位平臺中支配8字節。但64位平臺中仍然需要4個字節的整數。取消引用64位平臺上的整數指針

如果我想取消引用其內存開始包含另一個指針地址的指針,該怎麼辦。所以實際上我想取第8個字節的值。將取消引用*(int *)獲取4字節或8字節?我認爲它應該是4個字節,因爲整數是4個字節。但我怎麼能得到64位平臺的8字節?而不知道該平臺是32位還是64位。

+0

這有點難以遵循。你能給我們一個小的代碼片段作爲例子嗎? – litelite

+3

如果「內存開始包含另一個指針地址」,則需要通過指向指針的指針取消引用,而不是指向int的指針。如果某個地址處的「東西」是另一個地址,那麼指向指針的指針是唯一合理的途徑(最終通過*)到達它。所有這一切說,這有一個[XY問題]幾乎壓倒性的辛辣氣味(https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。你真的在做什麼,你是如何得到這個動物園作爲解決它的機制的? – WhozCraig

+0

如果你試圖強制使用8個字節,你可以使用'int64_t'而不是'int' – MikeChav

回答

3

讓我們做一些事情說清楚(這些都是獨立的平臺,但在大多數情況下),如果你的系統上:

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*

0

我不確定我是否理解你的問題,但實際上我認爲你根本沒有問題,因爲編譯器會自動爲你處理字的大小,爲每個平臺生成正確的代碼。因此,讓我們假設你調用返回一個指針的指針爲int的函數:如果取消引用這個指針,你會得到一個指向一個int,這將有每個平臺上適當的大小

int** ppiValue = SomeFunction(); 

int* piValue = *ppiValue; 

這將在64位處理器上爲8個字節,在32位處理器上爲4個字節。編譯器負責爲所選目標平臺選擇合適的大小。現在讓我們對這個指針進行解引用:

int iValue = *piValue; 

這將是兩個處理器上的4字節值。編譯器再次負責生成適當的機器代碼指令。

所以不要打擾 - 只要你依賴強類型,並且不使用危險的類型轉換,編譯器會照顧低級間接的細節。