Nota: Diese Antwort gilt für die Sprache C, nicht für C++.
Null-Zeiger
Die ganzzahlige Konstante literal 0
hat je nach dem Kontext, in dem es verwendet wird, unterschiedliche Bedeutungen. In allen Fällen handelt es sich um eine Integer-Konstante mit dem Wert 0
Sie wird nur auf unterschiedliche Weise beschrieben.
Wenn ein Zeiger mit dem konstanten Literal verglichen wird 0
ist dies eine Prüfung, ob der Zeiger ein Null-Zeiger ist. Diese 0
wird dann als Null-Zeiger-Konstante bezeichnet. Der C-Standard definiert, dass 0
in den Typ gegossen void *
ist sowohl ein Null-Zeiger als auch eine Null-Zeiger-Konstante.
Um die Lesbarkeit zu verbessern, wurde außerdem das Makro NULL
ist in der Header-Datei enthalten stddef.h
. Abhängig von Ihrem Compiler kann es möglich sein #undef NULL
und sie in etwas Verrücktes umdefinieren.
Daher sind hier einige gültige Möglichkeiten, um auf einen Null-Zeiger zu prüfen:
if (pointer == NULL)
NULL
ist so definiert, dass er mit einem Null-Zeiger gleichzusetzen ist. Es ist durch die Implementierung definiert, was die tatsächliche Definition von NULL
ist, sofern es sich um eine gültige Null-Zeiger-Konstante handelt.
if (pointer == 0)
0
ist eine weitere Darstellung der Null-Zeiger-Konstante.
if (!pointer)
Diese if
Anweisung prüft implizit "ist nicht 0", also kehren wir das um und meinen "ist 0".
Die folgenden Methoden zur Prüfung auf einen Null-Zeiger sind unzulässig:
int mynull = 0;
<some code>
if (pointer == mynull)
Für den Compiler ist dies keine Prüfung auf einen Null-Zeiger, sondern eine Gleichheitsprüfung für zwei Variablen. Diese könnte funktionieren, wenn sich mynull im Code nie ändert und die Compiler-Optimierungen die 0 konstant in die if-Anweisung falten, aber das ist nicht garantiert, und der Compiler muss gemäß dem C-Standard mindestens eine Diagnosemeldung (Warnung oder Fehler) erzeugen.
Beachten Sie, dass der Wert eines Null-Zeigers in der Sprache C auf der zugrunde liegenden Architektur keine Rolle spielt. Wenn die zugrunde liegende Architektur einen Null-Zeiger-Wert hat, der als Adresse 0xDEADBEEF definiert ist, muss der Compiler dieses Durcheinander in Ordnung bringen.
Daher sind selbst auf dieser lustigen Architektur die folgenden Möglichkeiten immer noch gültig, um auf einen Nullzeiger zu prüfen:
if (!pointer)
if (pointer == NULL)
if (pointer == 0)
Die folgenden Methoden zur Prüfung auf einen Null-Zeiger sind unzulässig:
#define MYNULL (void *) 0xDEADBEEF
if (pointer == MYNULL)
if (pointer == 0xDEADBEEF)
da diese von einem Compiler als normale Vergleiche angesehen werden.
Null-Zeichen
'\0'
ist als Nullzeichen definiert, d. h. als ein Zeichen, bei dem alle Bits auf Null gesetzt sind. '\0'
ist (wie alle Zeichenliterale) eine Integer-Konstante, in diesem Fall mit dem Wert Null. Also '\0'
ist völlig gleichwertig mit einem unverzierten 0
Integer-Konstante - der einzige Unterschied liegt in der Absicht die es einem menschlichen Leser vermittelt ("Ich verwende dies als Nullzeichen.").
'\0'
hat nichts mit Zeigern zu tun. Sie können jedoch etwas ähnliches wie diesen Code sehen:
if (!*char_pointer)
prüft, ob der char-Zeiger auf ein Nullzeichen zeigt.
if (*char_pointer)
prüft, ob der char-Zeiger auf ein Nicht-Null-Zeichen zeigt.
Diese sind nicht mit Nullzeigern zu verwechseln. Nur weil die Bit-Darstellung ist die gleiche, und dies ermöglicht für einige bequeme Cross-over-Fälle, sie sind nicht wirklich die gleiche Sache.
Referenzen
Siehe Frage 5.3 der comp.lang.c FAQ für mehr. Siehe dieses pdf für den C-Standard. Sehen Sie sich Abschnitt 6.3.2.3 Zeiger, Absatz 3 an.