C hat eine Eigenart, die Anfänger aus der Fassung bringt, aber komplexe Systeme antreibt. Sie können Dutzende Zeiger auf dieselbe Speicheradresse verweisen.
Betrachten Sie eine einfache ganze Zahl „i“. Sie können drei Zeiger – „p“, „q“ und „r“ – deklarieren und sie alle damit verknüpfen.
„c
int i;
int p, q, *r;
p = &i;
q = &i;
r = p;
„
Das ist keine Zauberei. Es handelt sich lediglich um das Kopieren von Adressen. Wenn Sie „r = p“ schreiben, kopiert der Compiler die von „p“ gehaltene Adresse in „r“. Das gleiche passiert mit „q“.
Jetzt hat „i“ vier Namen. Es ist „ich“. Es ist „p“. Es ist „ q“. Es ist „*r“.
Hierfür gibt es keine feste Grenze. Sie können Hunderte von Zeigern haben, die auf denselben RAM-Bereich verweisen. Jede davon ist eine eigene Variable in Ihrem Code, aber sie werden alle an genau derselben Stelle im Speicher aufgelöst.
Aus diesem Grund wirken sich Änderungen, die über einen Zeiger vorgenommen werden, auf alle anderen aus. „*p“ ändern? Der Wert an dieser Adresse ändert sich auch für „q“ und „r“. Es ist ein direkter Einblick in dieselben Daten.
Warum ist das wichtig? Weil es Aliasing ermöglicht. Ihr Programm kann dieselben Daten aus verschiedenen Blickwinkeln betrachten. Ein Zeiger könnte es als Struktur behandeln. Ein anderer könnte es als Rohbyte-Array behandeln. Die Daten ändern sich nicht. Die Interpretation tut es.
Diese Flexibilität ist kraftvoll. Hier verstecken sich auch Käfer. Wenn Sie den Überblick darüber verlieren, welcher Zeiger sich wo befindet, überschreiben Sie möglicherweise Daten, die Sie nicht beabsichtigt haben. Aber denken Sie vorerst daran: Zeiger sind nur Adressen. Und Adressen können geteilt werden.




















