Wie kann ich Zeiger in C++ komplett verstehen? Selbst nach 3 Semestern der C++-Programmierung (samt Datenstrukturen) verstehe ich immer noch nicht ganz, wie Zeiger funktionieren?
Verstehst Du den Adressaufkleber auf einem Paket?
An einer Adresse steht ein Haus. Der Adressaufkleber selbst ist kein Haus. Der Adressaufkleber ist auch nicht die Adresse wo das Haus steht. Der Adressaufkleber beinhaltet aber die Adresse, wo das Haus steht. Da soll das Paket hingebracht werden.
using Adresse = Haus *; 
 struct Adressaufkleber 
{ 
  Adresse Ziel; 
  Adresse Absender; 
}; 
Was steht auf dem Adressaufkleber drauf? Die Adresse des Hauses. In C++ heißt “Adresse von”: &. Also:
Haus Schillerstraße[10];   // Hier stehen 10 Häuser nebeneinander 
TiefeGrube Loch; 
Haus Goethestraße[10]; 
Adressaufkleber etikett={&Goethestraße[1], &Schillerstraße[8]; 
Das Haus Schillerstraße[8] hat eine Klingel. Funktioniert sie?
Schillerstraße[8].klingeln(); 
Wenn wir direkt am Haus stehen, kein Problem. Wie klingelt der Postbote?
Schicken wir den Postboten los. Der guckt aufs Etikett, da ist die Zieladresse drauf (.-Operator). Die Adresse vom Haus hat keine Klingel. Es ergibt also keinen Sinn beim Adressaufkleber die Klingel zu suchen. Um zu klingeln, muss man also erst dahingehen, wo das Haus steht: Das macht der ->-Operator.
etikett.Ziel->klingeln(); 
Keiner da? Dann geht der Postbote zum Nachbarn:
(etikett.Ziel+1)->klingeln(); 
Man kann auch sagen
etikett.Ziel[1].klingeln(); 
Also klingelt man bei Schillerstraße[9]. Da ist leider auch keiner. Gehen wir zum Nachbarn.
(etikett.Ziel+2).klingeln(); 
Leider ist nach Schillerstraße[9] kein Haus mehr, der Postbote fällt in die ungesicherte TiefeGrube mit dem Namen Loch: Das Programm ist abgestürzt.
Tu Dir selbst den Gefallen: Jeder Grundschüler kann einen Brief verschicken. Man spricht bei Computern nicht umsonst von Adressen. Das ist kein kompliziertes Konzept, das man langwierig studieren muss.
Man muss akzeptieren, dass Du Pointer verstehst und dann auch selbstsicher damit umgehen. Und manchmal fällst Du trotzdem in die Grube, wenn Du blind eine Straße entlangläufst.
Daten sind auf einer sehr langen Straße aufgereiht. Innerhalb eines Rechners ist die Stadt immer localhost, die Straße heißt immer RAM und daher ist alles, was man als Programmierer braucht, die Hausnummer. Das ist die Adresse im Computer. Mehr nicht. Auf manchen Grundstücken hast Du Zugriff, andere haben Speicherschutz, da beißt der Hund den Boten in den Hintern: Segmentation fault.
Begreife, dass es bei Pointern nichts Neues zu begreifen gibt. Wenn Du verstehst, wie Häuser (Datenblöcke) an einer Straße (dem RAM) in einer Reihe stehen, dann verstehst Du auch, dass eine Hausnummer kein Haus ist, aber Du mit dieser Nummer das Haus finden kannst oder Du kannst jemand anderem deine Adresse geben, ohne ihm gleich Dein ganzes Haus in die Hand zu drücken. Die Adresse reicht. Das sind Pointer. Das war’s.
Auch Pointer sind Datenobjekte. Wenn der Pointer einen Namen hat:
Adresse Heimatadresse; 
dann hat Heimatadresse einen Ort auf der Straße (RAM). Also selbst auch eine Adresse.
Die Adresse von dem Ort “Heimatadresse” ist &Heimatadresse.
Adresse * AdresseVonAdresse = &HeimatAdresse; 
AdresseVonAdresse zeigt auf eine Adresse. Heimatadresse zeigt auf ein Haus. Damit ist ein AdresseVonAdresse eine Adresse einer Adresse, die auf ein Haus zeigt. Oder in statt in Deutsch mal in C++:
Haus ** AdresseVonAdresse = &HeimatAdresse; 
Heimatadresse ist ein ganz normales Datenobjekt in dem halt eine Adresse gespeichert wird. Genauso ist AdresseVonAdresse ein ganz normales Datenobjekt, in dem eine Adresse gespeichert wird.
Der Unterschied ist lediglich, dass der Postbote bei Heimatadresse weiß, wo das Haus steht, bei Adresse von Adresse weiß er, wo er die nächste Adresse findet, die ihm verrät, wo das Haus steht. Er muss also einen Umweg machen auf dem Weg zum Haus.
Wenn der Postbote also morgens los will, um Pakete auszufahren, muss er erst zum Postamt. Die Adresse, wo der Postbote die Adresse findet, wo er dann das Paket hinbringen muss, ist das Postamt, weil das Etikett auf dem Paket, wo die Zieladresse draufsteht, nunmal auf dem Paket im Postamt steht. Er kann nicht direkt zum Haus, er muss den Umweg nehmen, sonst weiß er nicht, wo das Ziel ist.
Im Postamt nimmt er dann idealerweise auch das Paket gleich mit. ;)