Proper way of casting pointer types

c++, casting, pointers, reinterpret-cast, static-cast

Solution

For convertible pointers to fundamental types both casts have the same meaning; so you are correct that `static_cast` is okay.

When converting between some pointer types, it's possible that the specific memory address held in the pointer needs to change.

That's where the two casts differ. `static_cast` will make the appropriate adjustment. `reinterpret_cast` will not.

For that reason, it's a good general rule to `static_cast` between pointer types unless you know that `reinterpret_cast` is desired.

Problem

Considering the following code (and the fact that `VirtualAlloc()` returns a `void*`): ``` BYTE* pbNext = reinterpret_cast<BYTE*>( VirtualAlloc(NULL, cbAlloc, MEM_COMMIT, PAGE_READWRITE)); ``` why is `reinterpret_cast` chosen instead of `static_cast`? I used to think that `reinterpret_cast` is OK for e.g. casting pointers to and from integer types (like e.g. `DWORD_PTR`), but to cast from a `void*` to a `BYTE*`, isn't `static_cast` OK? Are there any (subtle?) differences in this particular case, or are they just both valid pointer casts? Does the C++ standard have a preference for this case, suggesting a way instead of the other?

Original source

Related problems