移动指针在cpp问题中转换为十六进制

时间:2018-01-16 07:32:45

标签: c++

我是cpp的初学者,我有指向特定地址的指针,我想将此指针12(在dec上)向下移动。 例如:

    int x=12
    node<int>* p = (node<int>*)m1;
    p=p-x;

但地址写成十六进制,所以我移动指针超过我想要的。 什么是最好的方法。 我想将x转换为十六进制,我将'c'作为一个字符串然后我卡住了 谢谢!

1 个答案:

答案 0 :(得分:2)

你没有移动更多,因为指针在视觉上由其十六进制值表示,这只是一种可视化指针的方法。 C ++中的指针算术与你期望的有点不同。当你从指针中减去时,你将减去一些具有指针指向大小的块。

这意味着p=p-x实际上是从指针中减去x * sizeof(node<int>)而不只是x。因此,要从指针中减去12个字节,您可以将指针强制转换为仅占用一个字节的内存,并减去指针值,然后将指针转换回其原始类型。但是在做这样的事情时要小心,如果你最终指向的东西不是所谓的类型,或者只是未分配,你就会遇到麻烦。

所以要减去12个字节,你需要在减去之前转换为uint8_t

int* p = new int(0);
cout << "Size of int: " << sizeof(int) << " Pointer: " << p << '\n';
int* p2 = p - 12;
cout << "Subtracting 12 (integers) from pointer: " << p2 << '\n';
uint8_t* bp = reinterpret_cast<uint8_t*>(p);
int* p3 = reinterpret_cast<int*>(bp - 12);
cout << "New integer pointer address: " << p3 << '\n';

结果输出类似于:

Size of int: 4 Pointer: 0x5555af8d1c20
Subtracting 12 (integers) from pointer: 0x5555af8d1bf0
New integer pointer address: 0x5555af8d1c14

请点击此处运行:https://ideone.com/uVTcsA