В первые дни С++, когда он был прикреплен болтами поверх C, вы не могли использовать NULL, поскольку он был определен как (void*)0. Вы не могли назначить NULL любому указателю, отличному от void*, что сделало его бесполезным. В те дни было принято, что для нулевых указателей вы использовали 0 (ноль).
До сих пор я продолжал использовать нуль в качестве нулевого указателя, но те, кто вокруг меня, настаивают на использовании NULL. Я лично не вижу никакой пользы от того, чтобы дать имя (NULL) существующему значению - и так как мне также нравится тестировать указатели как значения истинности:
if (p && !q)
do_something();
тогда использование нуля имеет больше смысла (как в случае, если вы используете NULL, вы не можете логически использовать p && !q - вам нужно явно сравнивать с NULL, если вы не предполагаете, что NULL равно нулю, и в этом случае используйте NULL).
Есть ли какие-либо объективные причины, чтобы предпочесть ноль по NULL (или наоборот), или это все личные предпочтения?
Изменить: я должен добавить (и должен был изначально сказать), что с RAII и исключениями, я редко использую указатели с нулевым /NULL, но иногда они вам все еще нужны.