(void *) is "language reference" thing and works for me.
There is a subtle but important difference between (void *) and uintptr_t - uintptr_t is _integral_ type (like int or long). E.g. you can perform full integral arithmetics with it (example: think about printing the address contained in pointer
The problem uintptr_t solves is that there is no fixed fundamental type that can be safely used to store and retrieve pointers. It is e.g. "int" or "unsigned int" on most 32-bit platforms, but that is not true on 64-bit CPUs anymore.