NULL is just the pointer analog to NaN
Its actually useful having a value that represents 'no value' provided you are prepared to use it as such. There's lots of reasons why you might want to have a variable holding a location in memory and there are going to be times when it won't have anything useful in it. If you assume you can't do this then you'll just have to create with every pointer the thing its pointing to; it won't necessarily have valid data, of course, so all you've done is move the problem one level. Having a concept like floating point's NaN is very useful in this situation.
The present situation is only undesirable because we insist on trying to give an empty pointer a value that resolves to something tangible like zero. This invites people to tinker with addresses as if they're integers. It also resolves to a location in memory which prevents the processor trapping out with a data segment access fault -- the code blithely collects what's in that location and makes use of it to cause a problem.