【发布时间】:2015-03-20 00:59:42
【问题描述】:
我知道您可以将 int 等类型转换为浮点数,但什么是转换指针?
例如,我一直在查看 Direct X API 的一些代码
reinterpret_cast<void**>(&mDirect3DDevice)
我不明白这里发生了什么。我认为铸造是你基本上将一种类型转换为另一种类型。
【问题讨论】:
我知道您可以将 int 等类型转换为浮点数,但什么是转换指针?
例如,我一直在查看 Direct X API 的一些代码
reinterpret_cast<void**>(&mDirect3DDevice)
我不明白这里发生了什么。我认为铸造是你基本上将一种类型转换为另一种类型。
【问题讨论】:
强制转换确实是将一种类型转换为另一种类型,或者更准确地说,是将一种类型的值转换为另一种类型的值。
在您的情况下,您正在将指向 mDirect3DDevice 的指针转换为指向 void * 的指针。
不过,一般来说,重新解释转换指针并不是很有用,因为您无法保证结果是有用的。唯一合理的重新解释演员表是:
void *,它们是往返保值的(也就是说,任何对象指针都可以转换为指向void 的指针并返回,然后你会得到原始值),但那些应该是使用static_casts 完成;char *,这对于访问底层字节表示的对象(例如,用于序列化)很有用;重新解释指针并取消引用结果允许您假装一种类型的值实际上是另一种类型的值 - 这仅在非常有限的情况下才有意义。 p>
【讨论】:
void * 的指针的表示。没有转换,它是别名。这是标准的 UB,但是(可能)在相关平台上,所有指针都具有相同的表示等,并且编译器实现了扩展来定义这种行为。
我相信任何变量都可以转换为指针,因为指针指向该变量在内存中的位置。所以在这种情况下,mDirect3DDevice 之前的& 返回变量mDirect3DDevice 的内存位置,而不是mDirect3DDevice 的内容。
我希望这会有所帮助!
【讨论】:
& 取变量的地址不叫“强制转换”...用词错误。