The primary reason, you cannot do bitwise operation on a void *, but you can do the same on a intptr_t.
On many occassion, where you need to perform bitwise operation on an address, you can use intptr_t.
However, for bitwise operations, best approach is to use the unsigned counterpart, uintptr_t.
As mentioned in the other answer by @chux, pointer comparison is another important aspect.
Also, FWIW, as per C11 standard, ยง7.20.1.4,
These types are optional.