uintptr_t and Other Helpful TypesOther useful types provided by <inttypes.h> include signed
and unsigned integer types large enough to hold a pointer. These are given as intptr_t and uintptr_t. In addition, intmax_t and uintmax_t are defined to be the longest (in bits) signed and unsigned integer
types available.
Using the uintptr_t type as the integral type for pointers is a
better option than using a fundamental type such as unsigned long. Even
though an unsigned long is the same size as a pointer in both the ILP32
and LP64 data models, the use of the uintptr_t requires only the definition
of uintptr_t to change when a different data model is used. This makes
it portable to many other systems. It is also a clearer way to express your intentions
in C.
The intptr_t and uintptr_t types are extremely useful
for casting pointers when you want to do address arithmetic. They should be used instead
of long or unsigned long for this purpose.
Use of uintptr_t for casting is usually safer than intptr_t, especially for comparisons.