Ironically, C originally used 0 as a sentinel address precisely because it could not hold a real value, because that's where the interrupt table was.
IIRC you had to cast 0 to a pointer, which made it a null pointer as distinct from arithmetic zero. Or am I confusing myself... It's been a while.