用C++计算指针的偏移量



我是一个c++新手

在我计算了Player结构的指针后,结果超出了我的意料

struct Player
{
const char* Name = "ab";
uintptr_t Health = 6;
uintptr_t Coins  = 3;
} player;

std::cout << &player << std::endl; // 0100C000
uintptr_t* playerBaseAddress = (uintptr_t*)&player;
std::cout << playerBaseAddress << std::endl; // 0100C000
std::cout << (playerBaseAddress + 4) << std::endl; // 0100C010

0100C000+4如何获得0100C004而不是0100C010

有人能解释一下吗?

像这个

uintptr_t playerBaseAddress = (uintptr_t)&player;

在您的版本中,您有一个指针,因此当您将4添加到指针时,结果将乘以所指向对象的大小。很明显,在您的平台上,uintptr_t的大小为4,因此您得到了0100C000 + 4*4,即0100C010

这也适用于

char* playerBaseAddress = (char*)&player;

因为这里char的大小是1。所以你得到了0100C000 + 1*4,它等于0100C004

在指针算法中,运算的大小乘以指针类型的大小。

这样就可以很容易地在内存中引用紧挨着的数据。

例如:

int* ptr = new int[5];
ptr[3] = 4;
std::cout << *(ptr+3) << endl; // 4
delete[] ptr;

您可以通过将其转换为一个字节大小的指针类型来添加四个字节,例如char*

playerBaseAddress的类型为uintptr_t*,它是一个指针。假设uintptr_t在您的环境中占用4个字节。现在这件

playerBaseAddress + 4

涉及指针运算:将指针向前移动4*sizeof(uintptr_t)=4*4=16字节。十六进制中的16是10。这就是你的结果。

注意uintptr_t* playerBaseAddress = (uintptr_t*)&player;无论如何都是UB。我想你指的是uintptr_t playerBaseAddress = (uintptr_t)&player;

可以使用offsetof来计算结构中的偏移量,例如

#include <cstddef>
#include <iostream>
struct Player {
const char *name = "ab";
uintptr_t health = 6;
uintptr_t coins  = 3;
};
int main()
{
size_t off = offsetof(Player, health);
std::cout << "off=" << off << 'n';
}

将显示4或8个,具体取决于结构和结构元素的大小。

最新更新