Hinweis: Diese Antwort gilt für die C-Sprache, nicht für C ++.
Nullzeiger
Das ganzzahlige Konstantenliteral 0
hat je nach Kontext, in dem es verwendet wird, unterschiedliche Bedeutungen. In allen Fällen ist es immer noch eine ganzzahlige Konstante mit dem Wert0
, es wird nur auf verschiedene Arten beschrieben.
Wenn ein Zeiger mit dem konstanten Literal verglichen wird, 0
wird überprüft, ob der Zeiger ein Nullzeiger ist. Dies0
wird dann als Nullzeigerkonstante bezeichnet. Der C-Standard definiert, dass die 0
Umwandlung in den Typ void *
sowohl ein Nullzeiger als auch eine Nullzeigerkonstante ist.
Um die Lesbarkeit zu verbessern, wird das Makro hinzugefügt NULL
in der Header-Datei bereitgestellt stddef.h
. Abhängig von Ihrem Compiler ist es möglicherweise möglich, #undef NULL
ihn zu etwas Verrücktem neu zu definieren.
Daher gibt es hier einige gültige Möglichkeiten, um nach einem Nullzeiger zu suchen:
if (pointer == NULL)
NULL
ist so definiert, dass es einem Nullzeiger entspricht. Es ist eine Implementierung, die definiert NULL
ist, wie die tatsächliche Definition lautet, solange es sich um eine gültige Nullzeigerkonstante handelt.
if (pointer == 0)
0
ist eine weitere Darstellung der Nullzeigerkonstante.
if (!pointer)
Diese if
Anweisung prüft implizit "ist nicht 0", daher kehren wir das um und bedeuten "ist 0".
Die folgenden Methoden sind UNGÜLTIG, um nach einem Nullzeiger zu suchen:
int mynull = 0;
<some code>
if (pointer == mynull)
Für den Compiler ist dies keine Prüfung auf einen Nullzeiger, sondern eine Gleichheitsprüfung für zwei Variablen. Dies kann funktionieren, wenn mynull den Code nie ändert und die Compiler-Optimierungskonstante die 0 in die if-Anweisung faltet. Dies ist jedoch nicht garantiert und der Compiler muss mindestens eine Diagnosemeldung (Warnung oder Fehler) gemäß C-Standard erstellen.
Beachten Sie, dass dies ein Nullzeiger in der Sprache C ist. Es spielt keine Rolle für die zugrunde liegende Architektur. Wenn die zugrunde liegende Architektur einen Nullzeigerwert hat, der als Adresse 0xDEADBEEF definiert ist, ist es Sache des Compilers, dieses Durcheinander zu beseitigen.
Selbst in dieser lustigen Architektur sind die folgenden Methoden immer noch gültige Methoden, um nach einem Nullzeiger zu suchen:
if (!pointer)
if (pointer == NULL)
if (pointer == 0)
Die folgenden Methoden sind UNGÜLTIG, um nach einem Nullzeiger zu suchen:
#define MYNULL (void *) 0xDEADBEEF
if (pointer == MYNULL)
if (pointer == 0xDEADBEEF)
da diese von einem Compiler als normale Vergleiche angesehen werden.
Nullzeichen
'\0'
wird als Nullzeichen definiert - das ist ein Zeichen, bei dem alle Bits auf Null gesetzt sind. Dies hat nichts mit Zeigern zu tun. Möglicherweise sehen Sie jedoch etwas Ähnliches wie diesen Code:
if (!*string_pointer)
Überprüft, ob der Zeichenfolgenzeiger auf ein Nullzeichen zeigt
if (*string_pointer)
Überprüft, ob der Zeichenfolgenzeiger auf ein Nicht-Null-Zeichen zeigt
Verwechseln Sie diese nicht mit Nullzeigern. Nur weil die Bitdarstellung dieselbe ist und dies einige bequeme Überkreuzungsfälle ermöglicht, sind sie nicht wirklich dasselbe.
Außerdem '\0'
ist (wie alle Zeichenliterale) eine Ganzzahlkonstante, in diesem Fall mit dem Wert Null. Ist '\0'
also völlig gleichbedeutend mit einer schmucklosen 0
Ganzzahlkonstante - der einzige Unterschied besteht in der Absicht , die sie einem menschlichen Leser vermittelt ("Ich verwende dies als Nullzeichen.").
Verweise
Weitere Informationen finden Sie in Frage 5.3 der FAQ zu comp.lang.c. In diesem PDF finden Sie den C-Standard. Lesen Sie die Abschnitte 6.3.2.3 Zeiger, Absatz 3.