使用uint32添加uint32 *

时间:2014-03-19 21:40:06

标签: c

我无法理解指针算法。任何帮助将不胜感激。

uint32* valA = 0x80000000; 
uint32 valB = 0x7a0

valA += valB;

valA的值是0x80001e80。这是valB的四倍。

怀疑我: 1.为什么valA的值没有变为0x800007a0。 2.如何使valA仅使用0x7a0递增,而不是valB值的四倍。

5 个答案:

答案 0 :(得分:4)

C中的指针算法按类型的大小进行缩放,这使得这两个等价:

valA = valA + valB;
valA = &valA[valB];

如果要强制它将其视为字节偏移量,则首先需要转换为char *

valA = (uint32 *)((char *)valA + valB);

答案 1 :(得分:0)

指针算术是指针指向的数据大小的问题。

uint32大4字节,因为结果是valB的四倍。

问题是,为什么你希望你的指针仅由0x7a0递增。在这种情况下,这没有任何意义。它只在您需要访问字节时才有用。如果只需要,你可以使用指向一个字节的指针。

答案 2 :(得分:0)

向指针添加int会使指针指向指针所指向的数据类型的多个实例。也就是说,如果您的系统sizeof(uint)是4个字节,则在将整数添加到指针地址之前将整数乘以4。

本质上,指针数学与数组寻址是同构的。如果p是指针且i是整数,p[i]*(p+i)相同......在旧的C编译器中,您甚至可以将其写为{{ 1}}并得到相同的结果。

答案 3 :(得分:0)

uint32占用4个字节的空间。 uint32之后的&valA &((valA + 4U))发生在{{1}}。

答案 4 :(得分:0)

C和C ++指针算术必须通过类型对象的大小来增加指针的值。

说你有:

int a[2];
int* b = a;

此时b指向a的第一个元素。现在,增加b

++b;

您希望b指向a的第二个元素。 a的第一个元素的地址和a的第二个元素的地址因int的大小而不同。因此,如果++b必须将b的值增加int的大小,而不仅仅是一个字节。