Due to their nature, pointers produce unverifiable code. Thus, usage of any pointer type requires an
System.IntPtr is a safe wrapper around a
void*. It is intended as a more convenient alternative to
void* when an unsafe context isn't otherwise required to perform the task at hand.
Like in C and C++, incorrect usage of pointers can invoke undefined behavior, with possible side-effects being memory corruption and execution of unintended code. Due to the unverifiable nature of most pointer operations, correct usage of pointers is entirely a responsibility of the programmer.
Unlike C and C++, not all C# types have corresponding pointer types. A type
T may have a corresponding pointer type if both of the following criteria apply:
Tis a struct type or a pointer type.
Tcontains only members that satisfy both of these criteria recursively.