void * und NULL

In ANSI-C ist es möglich, an beliebige Zeigervariablen eine Zeigerkonstante vom Typ void * ohne expliziten cast zuzuweisen.

Dementsprechend ist in ANSI-C die ,,ungültige`` Zeigerkonstante NULL als (void*)0 definiert (zumindest in stddef.h).

Eine Zuweisung eines void* an einen nicht-void-Zeiger ist in C++ nicht mehr zulässig, dafür aber die Zuweisung einer ganzzahligen 0 (-Konstante) an jeden Zeiger. Deshalb muß in C++ NULL einfach als Wert 0 definiert sein. (Die Zuweisung einer anderen int-Konstante ist dagegen ohne cast nach wie vor nicht erlaubt; der Wert 0 nimmt hier eine Sonderstellung ein.)

In [Strou IV] ist dafür ein nettes Beispiel zu finden:

  char *p =
             !    !  !    !  !      !
             ! !  !  !    !  !      !
             !  ! !  !    !  !      !
             !    !  !!!!!!  !!!!!  !!!!1;

Die daraus resultierende Empfehlung mancher Leute, wegen drohender Verwechslungsgefahr gleich auf NULL zu verzichten, und stattdessen 0 oder einen als 0 definierten Wert (NIL oder ähnliches) zu verwenden, halte ich für übertrieben. Wenn man weiß, daß NULL kein void * mehr ist, kann man es recht gefahrlos verwenden. NULL hat sich als ,,ungültiger Zeiger`` durchgesetzt; es gibt m.E. keinen vernünftigen Grund, das zu ändern.

AnyWare@Wachtler.de