有人能澄清我的錯誤解釋嗎?我知道我的理解是不正確的,因爲我的代碼的結果輸出(請參閱問題的底部)。 在此先感謝。指針訪問和數組訪問之間的值差異
爲了澄清,什麼是以下行的每個段的意思是?:
*(u8 *)((u32)BufferAddress + (u32)i)
它是如何從以下線路不同:
*(u32 *)((u32)BufferAddress + (u32)i)
我上面的解釋是:
- segment1 =((u32)BufferAddress +(u32)i)=>確定一個地址爲一個整數。
- segment2 =(u32 *)(segment1)=>將指針處理爲待處理地址,其中指針的長度爲32位。
- segment3 = *(segment2)=>取消引用指針以獲取駐留在計算出的地址的值。
我的解釋是什麼不正確?我認爲我的缺乏理解在第二部分領域...鑄造(u32 *)和(u8 *)有什麼區別?
這裏是讓我意識到我有知識差距代碼:
初始化代碼:
main(...) {
...
u8 *Buffer = malloc(256);
...
Buffer[0] = 1;
Buffer[1] = 0;
Buffer[2] = 0;
Buffer[3] = 4;
Buffer[4] = 0;
Buffer[5] = 0;
qFunction(... , Buffer, 6, ...);
...
}
qFunction(... , const u8 *BufferPointer, u32 BufferLength, ...) {
u32 BufferAddress;
...
BufferAddress = (u32) BufferPointer;
...
/* Method 1: */
for (i=0; i < BufferLength; i++)
printf("%d, %p\n", BufferPointer[i], &BufferPointer[i]);
/* Method 2: */
for (i=0; i < BufferLength; i++)
printf("%d, 0x%lx\n", *(u8 *)(BufferAddress+i), BufferAddress+i);
/* Method 3: */
for (i=0; i < BufferLength; i++)
printf("%d, 0x%lx\n", *(u32 *)(BufferAddress+i), BufferAddress+i);
...
}
方法1和方法2的輸出如我所料(兩者都相同):
1, 0x1000000
0, 0x1000001
0, 0x1000002
4, 0x1000003
0, 0x1000004
0, 0x1000005
但是,方法3的輸出對我來說似乎很奇怪;只有部分結果與方法1/2相同:
-1442840511, 0x1000000
11141120, 0x1000001
43520, 0x1000002
4, 0x1000003
0, 0x1000004
0, 0x1000005
我很感激任何提示或參考資料。 謝謝。
macduff的回答是正確的,但是一個評論加上;你應該儘量避免將指針轉換爲整數,因爲這是不必要的,如果將來決定構建64位(指針將是64位而不是32位),會導致問題。 –