Ein Punkt, den die meisten Antworten hier zumindest nicht explizit ansprechen, ist, dass ein Nullzeiger ein Wert ist, der während der Ausführung vorhanden ist, und eine Nullzeiger-Konstante ein syntaktisches Konstrukt ist, das im C-Quellcode vorhanden ist.
Eine Nullzeiger-Konstante ist , wie in der Antwort von Karlson richtig angegeben, entweder ein ganzzahliger konstanter Ausdruck mit dem Wert 0 (ein einfaches Beispiel 0
ist das gebräuchlichste) oder ein solcher Ausdruck, der in void*
(wie (void*)0
) umgewandelt wird.
NULL
ist ein Makro, das in <stddef.h>
und mehreren anderen Standard-Headern definiert ist und zu einer implementierungsdefinierten Nullzeiger-Konstante erweitert wird . Die Erweiterung ist normalerweise entweder 0
oder ((void*)0)
(die äußeren Klammern werden benötigt, um andere Sprachregeln zu erfüllen).
0
Wenn also ein Literal in einem Kontext verwendet wird, der einen Ausdruck vom Zeigertyp erfordert, wird es immer zu null pointer
einem eindeutigen Zeigerwert ausgewertet, der auf kein Objekt verweist. Das macht nicht bedeuten , etwas über die Darstellung eines Null - Zeiger . Nullzeiger werden sehr häufig als All-Bit-Null dargestellt, können aber als alles dargestellt werden. Aber auch wenn ein Nullzeiger als dargestellt 0xDEADBEEF
wird 0
oder (void*)0
immer noch eine Nullzeiger-Konstante ist .
Diese Antwort auf die Frage zum Stackoverflow deckt dies gut ab.
Dies impliziert unter anderem, dass memset()
oder calloc()
, das einen Speicherbereich auf Null setzen kann, keine Zeiger in diesem Bereich auf Null setzen muss. Bei den meisten Implementierungen ist dies wahrscheinlich der Fall, aber die Sprache garantiert dies nicht.
Ich weiß nicht , warum diese Frage nicht ein Duplikat betrachtet diese , oder wie es hier aktuell.