我是一个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个,具体取决于结构和结构元素的大小。