我需要将指针表示为用户的字符串。有时可能会将值保存到文件中并传输到具有不同体系结构的计算机(当前主要问题是32对64位)并从文本文件加载以进行比较 - 我只是将加载的值与彼此,但我仍然希望比较数字而不是字符串。
我目前正在使用:
SomeClass* p;
...
printf("%ld", (uintptr_t)p);
但是我想知道这是否可移植(Windows和Linux在这个阶段只是重要的),以及128位系统出现后是否会破坏?
编辑:除非我决定使用uint64_t,并确定64位是屋顶,否则无法完成,因为某些64位指针可能超出32位整数范围。所以,我认为比较字符串会更安全,即使速度较慢。
答案 0 :(得分:20)
对于指针,总是使用%p
---这是一个专门用于以正确格式打印指针的格式说明符。 : - )
答案 1 :(得分:9)
我会这样做:
std::cout << p;
如果你的心脏设置在cstdio上:
printf("%p", p);
答案 2 :(得分:7)
printf有一个%p格式化程序,我相信它是标准化的:
printf( "%p", p );
但是当你使用C ++时,ostreams已经重载了指针输出:
#include <iostream>
using namespace std;;
class A {};
int main() {
A a;
cout << &a << endl;
}
产生
0x22ff6f
答案 3 :(得分:3)
您在寻找%p
格式化字符串吗?
printf("%p", p);
这将给出指针所指向的十六进制编码地址(并且,我认为,也会为您格式化NULL
。)
答案 4 :(得分:0)
我会做的:
cout << p << endl;
字符串(具有相同编码)是可移植的。如果要将它们作为指针进行比较,则必须首先将字符串解析为unsigned long
。
至于128位系统,它们还有很长的路要走。对于64位,您可以直接寻址1680万TB的RAM。
答案 5 :(得分:0)
它也可以作为
完成printf(“%#x”,p);
这将确保跨平台的类似格式(0x ...)。