Lektion 32:

Zeiger

 Der Speicher des Computers ist in Bytes aufgeteilt. Jedes dieser Bytes hat eine eindeutige Adresse, durch die es angesprochen werden kann. Die Adresse ist eigentlich nichts anderes, als eine ganze Zahl, wird vom Compiler aber ein wenig anders behandelt.

   Belegt eine Variable nur ein Byte, dann ist die Adresse dieser Variablen die Adresse dieses Bytes. Belegt eine Variable mehr als ein Byte, dann ist die Adresse dieser Variablen die Adresse des ersten Bytes, das von dieser Variablen belegt wird. An die Adresse einer Variablen kommt man, indem man vor die Variable den Adreßoperator & schreibt. Eine Adresse kann man dann in eine andere Variable speichern. Diese andere Variable ist dann ein Zeiger. Hat man z.B. eine Variable vom Typ int, so kann man deren Adresse in einer Variablen vom Typ "Zeiger auf int" speichern. Sie zeigt auf einen int. Zeiger heißt auf englisch pointer, und um Zeigervariablen von normalen zu unterscheiden, wird oft ein kleines p vorne angehängt.

Mit Zeigervariablen kann man auch auf Adressen zeigen, denen keine Variable zugeordnet ist. Dabei muß man aber sehr aufpassen, weil der Versuch, etwas irgendwo in den Speicher zu schreiben, häufig zu Abstürzen führt und solche Fehler sehr schwer zu finden sind! Ein Zeiger wird deklariert, indem vor dem Bezeichner ein Sternchen steht. Um auf den Inhalt zuzugreifen, auf den ein Zeiger zeigt, schreibt man vor den Zeiger auch ein Sternchen. Man kann auch Zeiger auf Zeiger auf Zeiger... erzeugen, aber das ist meistens unsinnig und bringt nur Fehler, weil das sehr schnell sehr kompliziert wird.

Zeiger sind immer dann notwendig, wenn der Platzbedarf der zu verarbeitenden Daten zur Compilezeit(i:Compilezeit) (also wenn das Programm compiliert wird) nicht feststeht. Ansonsten könnten Sie ja ein Array verwenden, dessen Größe Sie im Programm festlegen können (und müssen). Es ist nämlich möglich, zur Laufzeit(i:Laufzeit) (also wenn das Programm ausgeführt wird) noch Speicherplatz zu besorgen.

Mit Zeigern lassen sich auch sehr schön Beziehungen zwischen Objekten beschreiben. So könnten z.B. Personen, die einen Stammbaum darstellen, so organisiert sein, daß jede Person noch einen je einen Zeiger auf Vater und Mutter hat. Solche Datenstrukturen heißen dynamische Datenstukturen(i:dynamische, Datenstrukturen), weil sie erst zur Laufzeit erzeugt werden.

Das folgende Beispiel ist auch sehr kompliziert. Sie sollten es unbedingt so lange durchlesen, bis Sie die jeweilige Kommentare selbst hinschreiben könnten.

#include <iostream.h>
void main()
{
   int a=5;// int a ist 5
   cout<<a<<endl;// Ausgabe: 5
   int *pa=&a;// int Zeiger pa ist Adresse von a
   *pa=6;// Inhalt von pa ist 6
   cout<<a<<endl;// Ausgabe: 6
   a=7;// a ist 7
   cout<<*pa<<endl;// Ausgabe: 7
   int b=8;// int b ist 8
   int *pb=pa;// int Zeiger pb ist pa, pb zeigt jetzt auch auf a
   cout<<*pb<<endl;// Ausgabe: 7
   int **ppa=&pa;// int Zeiger Zeiger ppa=Adresse von pa;
   cout<<**ppa<<endl;// Ausgabe: 7
   ppa=&pb;// Inhalt von ppa ist Adresse von pb;
   cout<<**ppa<<endl;// Ausgabe: 7
   pb=&b;// pb ist Adresse von b
   cout<<**ppa<<endl;// Ausgabe: 8
};


Falls Ihnen Fehler im Text auffallen oder Sie Verbesserungsvorschläge haben, dann schicken Sie mir bitte eine Mail. Ich werde mich dann sofort darum kümmern.
[aktuelle Version] [inhalt] [index]      [Fehlerkorrektur, Verbesserungsvorschlag]

© Volkard Henkel <volkard@normannia.de>, last update: 08/25/00