【发布时间】:2014-03-19 21:40:06
【问题描述】:
我无法理解指针运算。任何帮助将不胜感激。
uint32* valA = 0x80000000;
uint32 valB = 0x7a0
valA += valB;
valA 的值为 0x80001e80。这是 valB 的四倍。
我的疑惑: 1.为什么valA的值没有变成0x800007a0。 2. 如何使 valA 仅增加 0x7a0 而不是 valB 值的四倍。
【问题讨论】:
标签: c
我无法理解指针运算。任何帮助将不胜感激。
uint32* valA = 0x80000000;
uint32 valB = 0x7a0
valA += valB;
valA 的值为 0x80001e80。这是 valB 的四倍。
我的疑惑: 1.为什么valA的值没有变成0x800007a0。 2. 如何使 valA 仅增加 0x7a0 而不是 valB 值的四倍。
【问题讨论】:
标签: c
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 的大小,而不仅仅是一个字节。
【讨论】: