NULL ist eigentlich dafür gedacht, um Poitner zu leeren bzw. leere Pointer zu erkennen. Da man bei Pointern mit Adressen abreitet, mcht es Sinn, eine Art leere Adresse (was in Realität einfach Adresse 0x00000000 ist) irgendwie greifbar zu machen.

Wennman bei einer Variablen einen Leerwert, Fehlerwert etc haben will, baut man sich halt einfach ein define.

#define ERROR -1
#define EMPTY 0

was auch immer...