2

如何获取指针指向的值的内存地址?就我而言,它是一个空指针。只是将它分配给一个 uint 会给我这个错误:

Error   1   error C2440: 'return' : cannot convert from 'void *' to 'UInt32'

谢谢!

4

5 回答 5

14
std::size_t address = reinterpret_cast<std::size_t>(voidptr);
// sizeof(size_t) must be greater or equal to sizeof(void*)
// for the above line to work correctly.

@Paul Hsieh我认为转换到这个特定问题
就足够了,原因有以下三个:void*size_t

  • 提问者没有具体说明他是否想要便携式解决方案。他说,这对他有用。我不知道这到底是什么意思,但我很清楚他正在 Windows 或其他受保护模式下的系统上开发 IA-32。这意味着将指针转换为整数是该系统上已定义的操作,即使它不是由标准 C++ 定义的。

  • 其次,我建议首先将指针转换为litbjalf向我展示int的显然没有意义的指针。我纠正了我所做的错误,并替换为.intsize_t

  • 最后,我努力寻找与您在标准中提出的解决方案相关的内容。不幸的是,我找不到任何相关的东西。我有这个参考:ANSI ISO IEC 14882 2003。我认为sellibitze 指出它将成为未来标准的一部分。我真的不了解C,显然C99引入了这个完美的解决方案。我希望有人向我展示 C++ 中的可移植解决方案。

请不要犹豫,纠正我的错误,我仍然是大学的学生:)

谢谢,

于 2009-10-20T10:03:26.447 回答
11

在 C 和 C++中,指针是某种抽象形式的内存地址的体现。您可以将指针的特定于实现的字符串解释为:

printf ("%p", voidPointer);

另一种方法是将其转换为 intptr_t:

(intptr_t) voidPointer;

C++ 中的 NULL 指针被定义为等于“0”,所以在上面的操作中你可能会得到 (intptr_t) 0 的等价物。但是,这仍然取决于您以及您必须将其解释为内存地址的任何实现特定知识。

关键是,在使用奇怪内存模型的平台中,例如 16 位 x86 DOS 编译器,其内存模型具有带偏移量的段,指针可以以多种方式解释。在原始地址表示中,NULL 可以是 DS:0 或 SS:0 而不仅仅是普通的 0。

于 2009-10-20T10:17:04.660 回答
1

你需要一个演员 - 要么是reinterpret_cast(首选):

UInt32 address = reinterpret_cast<UInt32>( voidPointer );

或 C 风格的演员表(真的不推荐):

UInt32 address = (UInt32)voidPointer;
于 2009-10-20T10:07:19.903 回答
1

您可以使用 sprintf() 获取地址的字符串表示形式,或者使用 %p 格式说明符使用 printf() 显示它,例如:

printf( "%p", voidptr ) ;

如果您只想对地址执行指针运算,请将其转换为适当的具体数据类型指针,否则将其转换为已建议的整数。

于 2009-10-20T10:20:25.917 回答
0

在 C++ 中,我能够打印指向的地址:

cout << "Address: " << ((unsigned)my_ptr);
于 2012-09-24T12:17:40.970 回答