Mehrere Zeiger, die auf eine Speicheradresse zeigen

7

Mit C können Sie etwas tun, das auf den ersten Blick chaotisch aussehen könnte. Sie können mehrere Zeiger haben, die auf genau denselben Speicherort verweisen. Es ist kein Fehler. Es ist eine Funktion.

Betrachten Sie dieses Setup. Sie deklarieren eine Ganzzahl „i“. Dann deklarieren Sie drei Zeiger: „p“, „q“ und „r“.

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

p = &i;
q = &i;
r = p;

Schauen Sie sich an, was hier passiert. „p“ erfasst die Adresse von „i“. „q“ macht dasselbe. „r“ kümmert sich nicht direkt um „i“. Es kopiert einfach die Adresse, die „p“ enthält. Da „p“ auf „i“ zeigt, zeigt „r“ letztendlich auch auf „i“.

Nachdem diese Zeilen ausgeführt wurden, schweben nicht mehr drei separate Variablen herum. Sie haben eine Variable mit vier Aliasnamen.

  • ich
  • *p
  • *q
  • *r

Sie sind alle dasselbe.

Dies liegt daran, dass die Zeigerzuweisung eine Wertkopie der Adresse ist. Die Adresse auf der rechten Seite wird in die Variable auf der linken Seite verschoben. Es erfolgt keine tiefe Kopie der Daten. Es wird lediglich der Speicherplatz übertragen.

Dabei gibt es keine Begrenzung. Sie können beliebig viele Zeiger verketten. a = b; c = b; d = c; Es spielt keine Rolle. Sie verweisen alle auf die gleiche Stelle im RAM.

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

Warum ist das wichtig? Das bedeutet, dass Sie Referenzen frei weitergeben können. Sie können Daten für verschiedene Teile Ihres Codes aliasen, um sie zu verwenden. Sie können komplexe Datenstrukturen erstellen, in denen Knoten aufeinander verweisen.

Es bedeutet auch Vorsicht. Ändern Sie „p“ in „5“. Was passiert mit „i“? Es wird zu „5“. „ q“ ändern? „i“ ändert sich wieder. Alle Aliase sehen das gleiche Update.

Das ist einfaches C. Aber es ist leistungsstark. Und gefährlich, wenn man den Überblick darüber verliert, welcher Zeiger welcher ist.