NULL jest często w C definiowany jako 0 i jest gwarantowane, że 0 będzie działało jako wskaźnik pusty. W C++ (03) NULL musi być 0 (intem), w C może być chyba też (void *) 0. To makro jest zdefiniowane w celu oznaczania pustego wskaźnika, czyli wskaźnika który nie wskazuje na nic i używanie tego w jakimkolwiek innym celu, nawet jak się to kompiluje, jest błędem. Ciąg znaków kończy się znakiem zero ('\0' lub (char)0), a nie pustym wskaźnikiem. Nawet jak ze względu na automatyczne skracanie typów możesz przypisać, czy porównywać znaki z NULLem, to i tak się tego nie robi. Wprowadzasz zamieszanie dla innych programistów i prowokujesz tak błędy. Dodatkowo jak kompilator inaczej zdefiniuje NULLa, to Ci się taki kod nie skompiluje, bo jest błędny! Może tak zrobić i standardowy kompilator C, i kompilator C++11 (definiując NULLa jako nullptr).
BTW W VS chcieli domyślnie zdefiniować NULLa jako nullptr, ale okazało się, że dużo kodu się psuło przez używanie NULLa tam gdzie się tego nie powinno robić (tzn. wszędzie indziej, niż przy przypisywaniu do wskaźników).