簡體   English   中英

uint32 *與uint32的加法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM