我是cpp的初学者,我有指向特定地址的指针,我想将此指针12(在dec上)向下移动。 例如:
int x=12
node<int>* p = (node<int>*)m1;
p=p-x;
但地址写成十六进制,所以我移动指针超过我想要的。 什么是最好的方法。 我想将x转换为十六进制,我将'c'作为一个字符串然后我卡住了 谢谢!
答案 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