There are various dangers when casting pointers to different types but as a general rule, casting to a void pointer and back to the original pointer is considered safe. Unfortunately, this is not always the case as this little quiz demonstrates.
Question: What is the result of this code?
struct Foo { void func(){} }; typedef void (Foo::*func_t)(); int main() { func_t fp1 = func_t(&Foo::func); void * p = (void*) fp1; func_t fp2 = (func_t) p; Foo foo; (foo.*fp2)(); }
Answer: The result is undefined.
Why?
A pointer to a member is not a pointer to an object or a pointer to a function and the rules for conversions of such pointers do not apply to pointers to members. In particular, a pointer to a member cannot be converted to a void pointer.
The same is also true for function pointers, which cannot be safely cast to a void pointer.
More info: C++ FAQ Lite (member function pointers)
More info: C++ FAQ Lite (function pointers)