Nos primeiros dias do C ++, quando ele era aparafusado em cima de C, não era possível usar NULL como definido (void*)0. Você não pode atribuir NULL a nenhum ponteiro além de void*, o que o tornou meio inútil. Naqueles dias, era aceito que você usasse 0(zero) para ponteiros nulos.
Até hoje, continuei usando zero como ponteiro nulo, mas aqueles que estão à minha volta insistem em usá-lo NULL. Pessoalmente, não vejo nenhum benefício em atribuir um nome ( NULL) a um valor existente - e como também gosto de testar ponteiros como valores verdadeiros:
if (p && !q)
do_something();
então, usar zero faz mais sentido (como se você usar NULL, não é possível usar logicamente p && !q- você precisa comparar explicitamente NULL, a menos que assuma que NULLé zero; nesse caso, por que usar NULL).
Existe alguma razão objetiva para preferir zero a NULL (ou vice-versa), ou é apenas preferência pessoal?
Editar: devo adicionar (e pretendia dizer originalmente) que, com RAII e exceções, raramente uso ponteiros zero / NULL, mas às vezes você ainda precisa deles.