C++ 指针加法被乘

C++ Pointer addition being multiplied

我正在处理数据包代码,需要将指针移动 X 字节。当我告诉指针 pointer = pointer + X; 然后继续通过 to_string 或 cout 打印指针时,X*2 已添加到指针。我已经用多个值尝试过这个,包括常量和变量。我已经在操作前验证了指针的值。当发生这种情况时,我唯一能想到的是 3 正在某处移位。有什么想法吗?

示例代码:

cout << "Before: " << pointer << "\n";
pointer = pointer + 3;
cout << "After: " << pointer << "\n";

输出:

Before: 0x7ffff4604e93
After: 0x7ffff4604e99

我的包括:

#include <cstring>
#include <cstdlib>
#include <cstdarg>

谢谢,

麦克

pointer = pointer + X; 不会将指针移动 X 字节,而是将其移动 X * sizeof(*pointer) 字节。在这种情况下,如果 struct 的大小是 2 个字节,pointer = pointer + 3 应该将它移动 6 个字节,它有。

当你使用

pointer = pointer + 3;

pointer前后数值相差3*sizeof(*pointer).

在你的例子中,由于 sizeof(*pointer)2,你看到相差 6。一切正常。

C 和 C++ 中的指针加法总是将您添加的内容乘以指针指向的内容的大小。所以如果 p 是指向 int 的指针,那么 p+1 是指向下一个 int 的指针,而不是下一个字节。如果您想按精确字节访问指针,则必须确保它们是指向 char 或其他 1 字节类型的指针。 ((char*)p)+1 总是指向 p 之后的字节,无论其类型如何。

如果你真的想将你的指针增加 1 个字节,你可以创建另一个指针并增加它以获得地址,然后将它的地址分配给现有指针:

char *newPointer = (char *)pointer;
newPointer = newPointer + 1;

然后您可以通过以下方式将值重新分配给 pointer

pointer = &newPointer;

尽管像其他人所说的那样要小心,因为您将不再是您认为自己在结构中的位置。