[英]Addition of uint32* with uint32
我在理解指針算法時遇到麻煩。 任何幫助將不勝感激。
uint32* valA = 0x80000000;
uint32 valB = 0x7a0
valA += valB;
valA的值為0x80001e80。 這是valB的四倍。
我有疑問:1.為什么valA的值未更改為0x800007a0。 2.如何獲得僅以0x7a0遞增valA而不是valB值四倍的valA。
C語言中的指針算術按類型的大小縮放,這使這兩個等價:
valA = valA + valB;
valA = &valA[valB];
如果要強制將其視為字節偏移量,則需要首先強制轉換為char *
:
valA = (uint32 *)((char *)valA + valB);
指針算術與指針所指向的數據大小有關。
uint32的大小為4個字節,這是因為結果是valB的四倍。
問題是,為什么要讓指針僅增加0x7a0。 在這種情況下,這沒有任何意義。 僅在需要訪問字節時才有用。 如果只需要這樣,可以使用指向字節的指針。
在指針上添加一個int會使指針前進該指針指向的數據類型的許多實例。 也就是說,如果系統的sizeof(uint)
為4個字節,則在將整數添加到指針地址之前,該整數將乘以4。
本質上,指針數學與數組尋址是同構的。 如果p
是一個指針,而i
是一個整數,則p[i]
與*(p+i)
...相同,在舊的C編譯器中,您甚至可以將其寫為i[p]
並獲得相同的結果。
uint32
占用4個字節的空間。 &valA
之后的下一個uint32
發生在&((valA + 4U))
。
C和C ++指針算術必須將指針的值增加類型對象的大小。
說您有:
int a[2];
int* b = a;
此時b
指向的第一個元素a
。 現在,增加b
。
++b;
你可能會認為b
指向的第二個元素a
。 的第一元件的地址a
和第二元件a
是由大小不同int
。 因此,如果++b
必須遞增的值b
通過的大小int
,而不是僅僅一個字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.