Start > Informatik > C - Kurs > Pointer

Pointer


oder auch Adressen von Variablen.

Voraussetzungen:

Um diesen Kapitel folgen zu können ist folgendes Vorwissen notwendig (Inhalte aus BN):
  • Aufbau eines Speichers (Festplatte oder RAM)
  • Adressierung eines bestimmten Speicherplatzes (Festplatte oder RAM)

Sinn und Zweck

Die besondere Bedeutung von Pointer ergibt sich erst im Zusammenhang mit dem Kapitel Funktionen IV.
Daher gehört dieses Kapitel in die Kategorie "LESEN, LERNEN, VERSTEHEN, Begründung folgt später". Es ist nicht zu empfehlen, sich dieses Kapitel alleine vorzunehmen.
Bitte sehr gründlich lesen, da hier ein "Überfliegen" direkt zum "Absturz" führt.

Vorüberlegungen

Wir machen jetzt einen großen Rückschritt zu den Anfängen von Variablen.
Variablen speichern Werte im Speicher, das hatten wir. In diesem Kapitel geht es darum, wie der Computer intern seine Variablen wiederfindet.
Wir erweitern unsere bisherige Auflistung der Bestandteile einer Variable um folgendes:
  • Datentyp (was für eine Variable, z.B. für Buchstaben, Kommazahlen oder Ganzzahlen)
  • Name der Variable  (wie heißt die Variable)
  • Semikolon am Ende
  • Speicheradresse im RAM
Warum braucht man diese Adresse? Es gibt Befehle und Funktionen in C, die zwingend die Angabe einer Adresse erfordern, daher muss man das Thema verstehen.

Bedeutung der SpeicherAdresse für Betriebssysteme

Jeder von Euch hat schon mal von 32bit Betriebssystemen und 64bit Betriebssystemen gehört.
Vereinfacht gesagt ist die Länge einer Speicheradresse bei 32bit halt 32bit lang und bei 64bit halt 64bit lang.
Wenn der gesamte Speicher mit einer Zahl aus 32bit adressiert werden muss, dann gibt es eine maximale Speichergröße von 4 Gigabyte. Das ist auch der Grund, warum man in einen bis jetzt üblichen PC nicht mehr als 4 GB RAM einbauen kann.

Detail-Erklärung der Bedeutung der SpeicherAdresse für eine Variable

Man unterscheidet zwischen der physikalischen Speicheradresse und dem Inhalt an dieser Adresse.
Beim Deklarieren einer Variable passiert im Computer folgendes:
  1. Man reserviert genausoviel Speicher, wie durch den Datentyp der Variable angegeben wird.
  2. Dann schreibt sich der PC in eine "Liste", Name der Variable und die zugehörige Speicheradresse.
Bei der Wert-Zuweisung passiert nun folgendes:
  1. Zuerst guckt der PC nach, wo die Speicheradresse der Variable ist.
  2. Dann schreibt er die Daten genau an diese Speicheradresse im Speicher.
(Das Funktionsprinzip einer Festplatte ist genau gleich, die "Liste" heißt dort z.B.  FAT).
Man kann sich tatsächlich die Speicheradressen anzeigen lassen, dafür gibt es den sogenannten

Adress-Operator &

folgendes kleines Demoprogramm zeigt die physikalische Adresse der Variable iTest an:

    int main(){
       int iTest;
       iTest = 17;
       printf("Die Speicheradresse lautet %x", &iTest);
       printf("Der Inhalt der Adresse ist %d", iTest);
    }

Man erkennt, dass durch das Zeichen & vor einer Variable, die Speicheradresse ausgegeben wird. Man kann selbstverständlich das & Zeichen nur zum Anzeigen von Speicheradressen von Variablen verwenden.

Wie speichert man eine Speicheradresse?

Interessante Frage. Wir können eine Adresse mit dem &-Operator herausfinden, aber wo können wir eine Adresse in einer Variable ablegen. Eine Speicheradresse ist ja kein Buchstabe (also kein char), keine Integer Zahl (also kein int) und bestimmt keine Kommazahl (also kein float).
In welchen Datentyp kann man denn Speicheradressen ablegen.
In einer Pointer-Variablen. Pointer kommt aus dem englischen und bedeutet, dass hier keine Werte gespeichert werden, sondern nur Adressen, die auf einen bestimmten Bereich im RAM zeigen (engl. = to point).

Beispiel für eine PointerVariable

    int main(){
       int* piTest;       //<-- hier wird eine Pointer Variable angelegt
       int iTest;

       piTest = &iTest;      //<-- eine Speicheradresse in piTest ablegen

    }

Achtung: Beim Speichern von Adressen kommt es jedoch immer mit auf den Datentyp der zu speichernden Adresse an.

Man kann erkennen, das durch das * hinter dem Datentyp angegeben wird, dass es sich um eine Pointer-Variable handelt.

Wenn wir auf diese Art eine Adresse einer Variablen ermitteln und abspeichern können, was passiert wenn wir die Adresse bereits kennen, aber den Inhalt an dieser Stelle haben wollen?

Adresse bekannt, wer wohnt da?

Ein praktisches Beispiel: "Nordstr. 4, 12345 Musterstadt". Wer wohnt da? Normalerweise geht man dann zu der Adresse und schaut auf dem Klingelschild nach. Genauso machen wir das in C wir mit dem Dereferenzierungsoperator *.
Mit diesem Operator kann man den Inhalt an einer bestimmten Speicherstelle bekommen.

Beispiel Verwendung des Dereferenzierungs-Operators

    int main(){
       int* piTest;
       int iTest;

       piTest = &iTest;

       //so nun gib den Inhalt von piTest mal aus
       printf ("Der Inhalt der Speicheradresse in piTest ist %d", *piTest );
    }

Vorsicht: Das * vor dem Variablennamen hat nichts mit dem * hinter dem Datentyp zu tun. Es ist zwar dasselbe Zeichen, sie machen aber etwas vollkommen unterschiedliches. Das eine braucht man zur Deklaration, das andere zum Dereferenzieren.
Mit Hilfe des De-referenzierungs-Operators vor der Pointer-Variable bekommt man den Inhalt/Wert an der Speicherstelle, die in piTest steht.

Zusammenfassung

Dieses Kapitel ist schwer, weiß ich. Für alle die bis hierher durchgehalten haben eine kurze Zusammenfassung:

  • Es gibt eine physikalische Speicheradresse für eine Variable. Diese Adresse kann man mit Hilfe des Variablennamens und des Adress-Operators & bestimmen.
  • Eine normale Variable kann keine Speicheradressen aufnehmen, dazu benötigt man eine spezielle Pointer-Variable. Die wird durch das * nach dem Datentyp gekennzeichnet.
  • Um mit Hilfe einer Pointer-Variable (die ja nur eine physikalische Adresse enthält) an den Inhalt/Wert der Pointer-Variable zu kommen, benötigt man den De-referenzierungs-Operator * vor der PointerVariable.
Damit man dieses Thema tatsächlich versteht, ist ein Besuch des Unterrichts unbedingt notwendig, weil hier ziemlich häufig die Begriffe nicht ganz klar sind.
Durch gezielte Fragen an den Lehrer, kann man dieses Thema am besten verstehen. Es ist nicht zu empfehlen, sich dieses Kapitel alleine vorzunehmen. (wie ich oben bereits bemerkt habe)

Infoblätter und Arbeitsblätter Paragraph

Grundlagen Pointer
Info: Dieses Infoblatt beschreibt ganz kurz nochmal die Bedeutung von Pointern und gibt ein paar Syntax-Beispiele.

Übungen zu Pointern
Info: Dieses Arbeitsblatt enthält ein paar kleine Übungen, die sich direkt auf das obige Infoblatt beziehen. Die Übungen sind ganz einfach und dienen dem Verständnis.
Ticker
Last update:
June 29. 2017 19:48:11