Dereferenzieren bedeutet nur den Speicherwert an einer gegebenen Adresse zu lesen. Also, wenn Sie einen Zeiger auf etwas haben, zu dereferenzieren den Zeiger bedeutet, zu lesen oder schreiben Sie die Daten, auf die der Zeiger zeigt.
In C ist der unäre Operator *
der Dereferenzierungsoperator.Wenn x
ein Zeiger ist, dann zeigt *x
was x
zeigt. Der unäre &
-Operator ist die -Adresse des Operators. Wenn x
irgendetwas ist, dann ist &x
die Adresse, unter der x
im Speicher gespeichert ist. Die *
und &
Operatoren sind invers zueinander sind: wenn x
keine Daten vorhanden sind, und y
ist jeder Zeiger, dann diese Gleichungen sind immer wahr:
*(&x) == x
&(*y) == y
Ein Null-Zeiger ist ein Zeiger, der nicht auf einen beliebigen gültigen nicht zeigen Daten (aber es ist nicht der einzige solche Zeiger). Der C-Standard besagt, dass es undefined Verhalten ist, einen Nullzeiger zu dereferenzieren. Das bedeutet, dass absolut alles passieren kann: Das Programm könnte abstürzen, es könnte weiter leise arbeiten, oder es könnte Ihre Festplatte löschen (obwohl das eher unwahrscheinlich ist).
In den meisten Implementierungen erhalten Sie einen "Segmentierungsfehler" oder "Zugriffsverletzung", wenn Sie dies versuchen, was fast immer dazu führt, dass Ihr Programm vom Betriebssystem beendet wird. Hier ist eine Möglichkeit ein Null-Zeiger dereferenziert werden könnte:
int *x = NULL; // x is a null pointer
int y = *x; // CRASH: dereference x, trying to read it
*x = 0; // CRASH: dereference x, trying to write it
Und ja, ein Null-Zeiger-Dereferenzierung ist so ziemlich genau wie ein NullReferenceException
in C# (oder ein NullPointerException
in Java), mit der Ausnahme, dass das Langauge Standard ist ein wenig mehr hilfreich hier. In C# hat das Dereferenzieren einer Nullreferenz ein wohldefiniertes Verhalten: Es wird immer eine NullReferenceException
ausgelöst. Es gibt keine Möglichkeit, dass Ihr Programm ruhig weiterarbeiten oder Ihre Festplatte wie in C löschen kann (es sei denn, es gibt einen Fehler in der Sprachlaufzeit, aber auch das ist unglaublich unwahrscheinlich).
Denken Sie daran, dass dies zu undefiniertem Verhalten führt. Sie erhalten keine Ausnahmen oder irgendetwas in C oder C++. – GManNickG
Sie können einen Beispielcode eingeben. Es scheint, dass Leute (einschließlich mir) nicht bekommen, was Sie versuchen zu fragen. –
Keine Notwendigkeit für Code (es gibt keine) - Dies ist ein konzeptionelles Problem, das ich habe, versuchen, den Kopf über die Terminologie der "Dereferenzierung" zu bekommen und warum ich mich darum kümmern sollte. – Ash