我无法理解指针算法。任何帮助将不胜感激。
uint32* valA = 0x80000000;
uint32 valB = 0x7a0
valA += valB;
valA的值是0x80001e80。这是valB的四倍。
怀疑我: 1.为什么valA的值没有变为0x800007a0。 2.如何使valA仅使用0x7a0递增,而不是valB值的四倍。
答案 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
的大小,而不仅仅是一个字节。