int i = 1000;
void *p = &i;
int *x = static_cast<int*>(p);
int *y = reinterpret_cast<int*>(p);
应该使用哪个广告代码从void*
转换为int*
以及为什么?
答案 0 :(得分:13)
static_cast
前提是您(通过设计程序)知道指向的内容确实是int
。
static_cast旨在反转任何隐式转换。您已隐式转换为void*
,因此您可以(并且应该)使用static_cast
转换回来,如果您知道您确实只是在撤消之前的转换。
有了这个假设,没有任何东西被重新解释 - void
是一个不完整的类型,意味着它没有值,所以在任何时候你都不会将存储的int值解释为“void”或存储的“void”值“为int。 void*
只是一种丑陋的说法,“我不知道这种类型,但我会将指针传递给其他人。”
reinterpret_cast
如果您遗漏了一些细节,这些细节意味着您实际上可能正在使用类型以外的类型读取内存,并且请注意您的代码将具有有限的可移植性。
顺便说一下,在C ++中以这种方式使用void*
指针的原因并不是很多。 C样式的回调接口通常可以替换为模板函数(对于任何类似于标准函数qsort
的东西)或虚拟接口(对于任何类似于已注册侦听器的东西)。如果您的C ++代码使用的是某些C API,那么您当然没有太多选择。
答案 1 :(得分:1)
在当前的C ++中,您不能在该代码中使用reinterpret_cast
。对于void*
到int*
的转换,您只能使用static_cast
(或等效的C风格转换)。
对于不同函数类型指针之间或不同对象类型指针之间的转换,您需要使用reinterpret_cast
。
在C ++ 0x中,reinterpret_cast<int*>(p)
will be equivalent到static_cast<int*>(p)
。它可能包含在下一个WP之一中。
这是一种误解,reinterpret_cast<T*>(p)
会解释p
的位,就像它们代表T*
一样。在这种情况下,它将使用p
的类型读取p
的值,然后将该值转换为T*
。使用类型p
的表示直接读取T*
的位的实际 type-pun 仅在转换为引用类型时发生,如reinterpret_cast<T*&>(p)
中所示。
据我所知,所有当前的编译器都允许来自reinterpret_cast
的{{1}}并且行为等同于相应的void*
,即使当前C +中不允许这样做+03。被拒绝时代码被破坏的数量将无济于事,因此他们没有动力禁止它。
答案 2 :(得分:0)
答案 3 :(得分:-1)
从问题的语义来看,我会重新解释,因为这就是你实际做的事情。