Seriously, have any actual machines really used nonzero null pointers, or different representations for pointers to different types?
The Prime 50 series used segment 07777, offset 0 for the null pointer, at least for PL/I. Later models used segment 0, offset 0 for null pointers in C, necessitating new instructions such as TCNP (Test C Null Pointer), evidently as a sop to all the extant poorly-written C code which made incorrect assumptions. Older, word-addressed Prime machines were also notorious for requiring larger byte pointers (char *’s) than word pointers (int *’s). Some Honeywell-Bull mainframes use the bit pattern 06000 for (internal) null pointers.