Eine normale Variable wie int x speichert einen Wert, und das Programm legt diesen Wert irgendwo im Speicher ab. Der Name x ist eine praktische Bezeichnung, die der Compiler bereitstellt, damit man den gespeicherten Wert lesen und schreiben kann, ohne sich Gedanken über den physischen Speicherort machen zu müssen.
Dieser Speicherort ist dennoch wichtig, da die CPU beim Laden und Speichern letztlich mit Adressen arbeitet. Selbst wenn man x = 5; schreibt, verwendet der kompilierte Code im Hintergrund eine Adresse, um die zu x gehörenden Bytes zu finden und zu überschreiben.
Man kann sich den Speicher gut als eine lange Folge von Bytes vorstellen, bei der jedes Byte einen Index besitzt, der als Adresse bezeichnet wird. Wenn der Compiler x anlegt, wählt er einen Adressbereich aus, der groß genug für einen int-Wert ist, und sorgt dafür, dass sich jede Verwendung des Namens x auf diesen Bereich bezieht.
Aus diesem Modell ergeben sich zwei Konsequenzen:
x, überschreibt man die Bytes in diesem Adressbereich.y = x, erhält man normalerweise einen eigenen Adressbereich mit einer Kopie des Werts; spätere Änderungen an x wirken sich also nicht auf y aus.Ein Pointer (Zeiger) ist eine Variable, deren Wert eine Adresse ist. Er speichert nicht den int-Wert selbst, sondern den Ort im Speicher, an dem sich der int-Wert befindet, sodass man dieser Adresse folgen kann, um auf den int-Wert zuzugreifen.
In C++ wird dies durch zwei Operatoren konkret umgesetzt:
&x // Adressoperator (address-of): liefert die Adresse, an der x gespeichert ist
*p // Dereferenzierungsoperator: greift auf den Wert zu, der an der in p gespeicherten Adresse liegt
Betrachten Sie die Speicherelemente und wie sich der Wert ändern kann, während die Adresse gleich bleibt.
Wichtige Invariante Wenn
pgleich&xist, dann verweist*pauf denselben gespeicherten Wert wiex.
Sobald man eine Adresse speichern kann, lässt sich der Zugriff auf ein Objekt gemeinsam nutzen, anstatt es zu kopieren. Dies ist in einigen häufigen Situationen relevant:
nullptr sein, um das Fehlen eines Objekts zu signalisieren; dadurch wird die Abwesenheit direkt im Typ ausgedrückt.Vergleichen Sie die Szenarien „Kopieren“ und „gemeinsame Nutzung“ und beobachten Sie die Unterschiede hinsichtlich der Änderung von Daten und des Aufwands.