The problem with NULL not being 0 is you can't do things like `if(ptr)`
The compiler understands it is a pointer, and that you are checking if it is equal to nullptr, and generates the right code.
Another smart adjustment when making a new ABI is to make true represented as -1. This matches how AVX* and SIMD instructions do things. (The RISC-V people missed this opportunity, among others.) Of course when converting to int, it gets turned into 1, but compilers have absolutely no difficulty with that.
Pointers, as per the standard, have an implicit conversion to bool that evaluates to true if and only if the pointer is not exactly nullptr. Code like:
if (ptr) {
...
}
is guaranteed to work the way you expect it to, regardless of how null pointers are implemented.