C-Zeiger: Warum mehrere Variablen dieselbe Speicheradresse teilen

9

In C können Sie mehrere Zeiger haben, die alle auf genau denselben Speicherort zielen. Es ist kein Fehler. Es ist eine Funktion.

Sie können drei ganzzahlige Zeiger deklarieren: „p“, „q“ und „r“. Dann können Sie sie alle so einstellen, dass sie auf dieselbe Ganzzahlvariable „i“ verweisen.

„c
int i;
int p, q, *r;
p = &i;
q = &i;
r = p;

Sehen Sie, was hier passiert. „p“ erhält die Adresse von „i“. „q“ erhält auch die Adresse von „i“. „r“ bekommt alles, was „p“ enthält. Das ist die Adresse von „i“.

Nachdem dieser Code ausgeführt wurde, haben Sie eine seltsame Situation. „i“ hat jetzt vier Namen. Sie können darauf mit „i“, „p“, „ q“ oder „*r“ zugreifen. Sie beziehen sich alle auf dieselbe Stelle im RAM.

So funktioniert die Zeigerzuweisung

Wenn Sie einen Zeiger einem anderen zuweisen, kopieren Sie nicht den Wert, auf den sie zeigen. Sie kopieren die Adresse.

„r = p“ kopiert nicht die Ganzzahl „i“. Es kopiert die in „p“ gespeicherte Speicheradresse. Da „p“ die Adresse von „i“ enthält, enthält „r“ jetzt auch die Adresse von „i“.

Es gibt keine Begrenzung, wie viele Zeiger eine Adresse gemeinsam nutzen können. Sie könnten zehn Hinweise haben. Oder einhundert. Sie weisen alle nur auf dasselbe hin.

Warum das wichtig ist

Dieses Verhalten verändert Ihre Einstellung zu Daten. Eine einzelne Variable im Speicher kann viele Aliase haben. Wenn Sie den Wert über einen Zeiger ändern, sieht jeder andere Zeiger die Änderung.

„c
*p = 10;

Jetzt ist „i“ 10. „q“ ist 10. „ r“ ist 10. Sie betrachten alle dieselben Daten.

Das ist nützlich. Sie können damit Referenzen auf Funktionen übergeben, ohne große Strukturen kopieren zu müssen. Dadurch können verschiedene Teile Ihres Codes mit denselben Daten arbeiten. Aber es bedeutet auch, dass man vorsichtig sein muss. Das Ändern eines Zeigers kann Auswirkungen auf andere haben.

Häufige Missverständnisse

Einige Anfänger glauben, dass das Zuweisen von Zeigern die Daten kopiert. Das ist nicht der Fall. Es kopiert die Adresse.

Andere fragen sich, ob es eine Grenze gibt. Es gibt keine. Mit der Sprache können Sie so viele Zeiger erstellen, wie Sie benötigen. Der Compiler hält Sie nicht auf.

Das Fazit

Mehrere Zeiger können auf dieselbe Adresse verweisen. Dies ist das Standardverhalten von C. Sie können einander Zeiger zuweisen. Die Adresse wird kopiert, nicht der Wert. Die Variable bleibt gleich. Die Namen vervielfachen sich einfach.

„Es gibt keine Begrenzung für die Anzahl der Zeiger, die dieselbe Adresse enthalten (und daher auf diese verweisen können).“

Diese Flexibilität ist kraftvoll. Es erfordert Disziplin. Aber es ist grundlegend für die Funktionsweise von C. Wenn Sie dies verstehen, verstehen Sie ein Kernkonzept der Speicherverwaltung in C.