C did not say 0 was the sentinel address. Most implementations had it as 0, but it could be any address, and K&R (first edition - highly recommended) had a table of what NULL was on various platforms - most were 0, but not all. In C++98 0 was the sentinel address, resulting in the compiler having to guess if you really meant 0 or whatever NULL really was when you have 0 in the code if NULL wasn't 0. C++11 introduced nullptr which is implementation defined.