如何转换 void* 即指向数字的指针?
您可以reinterpret_cast
使用指针类型std::uintptr_t
(或有符号的等价物)。然后,您可以进一步转换为另一种整数类型,例如std::size_t
,该转换可以是隐式的。std::size_t
理论上,后一种转换在较小类型的系统上可能是有损的。
但是,就 C++ 语言而言,除了将其转换回std::uintptr_t
相同的指针类型将产生相同的指针值之外,不能保证结果数字。
另外你能显示一些代码吗?
例子:
void* ptr = sbrk(0);
auto numptr = reinterpret_cast<std::uintptr_t>(ptr);
static_assert(sizeof(std::size_t) >= std::uintptr_t,
"Sorry, it isn't possible to represents pointers using std::size_t on this system");
std::size_t example = numptr;
auto ptr2 = reinterpret_cast<void*>(numptr);
assert(ptr2 == ptr); // guaranteed to pass
为什么 reinterpret_cast 不是(uintptr_t)?
显式转换(又称 C 样式强制转换)的行为取决于操作数的类型。有些石膏是不安全的,而另一些是良性的。通常简单的错误会导致预期的安全转换意外地不安全,从而导致未定义的行为(这是非常糟糕的) - 而正确的 C++ 样式转换会导致编译错误,从而导致检测到错误(这非常好)。
在 reinterpret_cast 的情况下,我们正在执行这种不安全的强制转换,因此没有安全方面,但 C++ 风格强制转换的重要性在于将这种缺乏安全性传达给程序的读者。
不要在 C++ 中使用 C 风格的强制转换。你不需要他们做任何事。