NULL was introduced into C in 1978 or so. It *had* to be 0 or 0L.
NULL was adopted unchanged into C++ for compatibility reasons.
I never liked it and have consistently warned against its use.
In the late 1980s void* was introduced into C++ and a bit later in an incompatible and type unsafe form into C.
In C89, the definition of the NULL macro was changed in C to (void*)0. That definition cannot be used in C++ because it would prevent assignment of NULL to a pointer.
In C++98 it is actually allowed to implement NULL as a value that cannot be converted to an int, but not all implementations take advantage of that
In C++0x, you will be able to use nullptr to minimize confusion and resolver integer/pointer ambiguities. This is not a perfect solution because you can still (for compatibility reasons) use 0 and an old-style NULL.
For an example of why void* to T* conversions are unsafe, see
Stroustrup: C++ Style and Technique FAQ