C# inherits from C and C++ the usage of void* as a type-agnostic and size-agnostic pointer.
void* ptr;
Any pointer type can be assigned to void* using an implicit conversion:
int* p1 = (int*)IntPtr.Zero;
void* ptr = p1;
The reverse requires an explicit conversion:
int* p1 = (int*)IntPtr.Zero;
void* ptr = p1;
int* p2 = (int*)ptr;