Video

Du bist bereits ein Profi in der Anwendung von Zeigern, hast aber keine Ahnung, wie deren Erweiterung funktioniert? In diesem Beitrag zeigen wir es dir, denn es geht um die Doppelzeiger!

Inhaltsübersicht

Doppelzeiger: Zeiger mit mehreren Ebenen

Als erstes sollten wir einmal klären, was Doppelzeiger überhaupt sind. Du kannst dir diese vorstellen wie einen Zeiger, der auf einen Zeiger zeigt. Das heißt, wir haben praktisch einen Zeiger mit mehreren Ebenen.

Doppelzeiger
direkt ins Video springen
Doppelzeiger sind Zeiger mit mehreren Ebenen

Umwandlung von Einfachzeigern in Funktionen

Sehen wir uns das einmal im Arbeitsspeicher an, so sieht das in etwa so aus: Wir haben unseren „normalen“ Pointer p auf der ersten Ebene. Dieser ist an einer beliebigen Stelle im Arbeitsspeicher abgelegt und zeigt auf unsere zweite Ebene. Diese liegt an einer anderen, ebenfalls beliebigen Stelle im Arbeitsspeicher und zeigt auf die dritte und letzte Ebene, die aus Dateneinträgen besteht.

Doppelzeiger
direkt ins Video springen
Erste, zweite und dritte Ebene im Arbeitsspeicher

Nun fragst du dich bestimmt, was du damit überhaupt anfangen kannst? Du kannst damit Einfachzeiger in Funktionen umbiegen. Das braucht man zum Beispiel zum dynamischen Einlesen einer Zeichenfolge, wo es für die Übergabe der Adresse eines Zeigers auf eben diese Zahlenfolge verwendet wird. Konkret heißt das, dass in der Funktion, in die wir die Zeichenkette übergeben, selbst ein Doppelzeiger zur Manipulation dieser Zeichenkette verwendet wird.

Doppelzeiger
direkt ins Video springen
Call-by-Reference Prinzip

Diese Art der Anwendung für Doppelzeiger basiert darauf, dass der Zeiger auf den neu reservierten Speicherbereich mittels Dereferenzierung umgebogen wird. Das Prinzip dahinter nennt man Call-By-Reference.

Studyflix vernetzt: Hier ein Video aus einem anderen Bereich

Anwendung in der dynamischen Matrizenrechnung

Das Ganze kann aber auch für die dynamische Matrizenrechnung verwendet werden. Konkret sieht das dann im Speicher so aus:

Doppelzeiger
direkt ins Video springen
Doppelzeiger in der dynamischen Matrizenrechnung

Auf Ebene eins haben wir wieder unseren Pointer p, der auf unsere zweite Ebene zeigt, in der unsere Zeilen liegen. Die tatsächlichen Einträge dieser Zeilen bzw. unsere Spalten liegen auf der dritten Ebene. Wenn wir das Ganze also ausgeben, erhalten wir etwas in dieser Form:

Doppelzeiger
direkt ins Video springen
Ausgabe der Einträge

Das liegt daran, dass unser Pointer zunächst auf einen anderen Pointer verweist und dieser dann die entsprechenden Werte aufruft. Aber bevor du dich in ein Codebeispiel stürzt, solltest du noch wissen, wie man einen Doppelzeiger im Allgemeinen deklariert, damit du auch eine Chance hast, einen solchen im Quellcode zu identifizieren.

Deklarierung von Doppelzeigern

Willst du zum Beispiel einen Doppelzeiger vom Typ int deklarieren, kannst du das mit int **p tun. Die doppelten Sterne stehen für die Tatsache, dass es sich hier um einen Doppelzeiger handelt. Des weiteren kannst du ihn so wie er jetzt ist bereits wie ein Array benutzen oder gar für eine der vorher bereits erwähnten Möglichkeiten verwenden.

Doppelzeiger
direkt ins Video springen
Deklarierung eines Doppelzeigers vom Typ int

Außerdem solltest du noch wissen, dass Teile von Doppelzeigern immer dynamisch reserviert werden, was bedeutet, dass sie auch wieder freigegeben werden müssen. Tust du das nicht, kann es genauso wie bei Arrays und Variablen, die auf diese Weise reserviert wurden, zu Programmfehlern kommen.

Jetzt weißt du was Doppelzeiger sind, wie man sie in Funktionen umwandelt und wie du sie deklarieren kannst. Viel Erfolg beim Lernen!

Doppelzeiger — häufigste Fragen

(ausklappen)
  • Was bedeutet Dereferenzierung?
    Dereferenzierung bedeutet, dass man einem Zeiger zur Adresse folgt und den Wert liest oder schreibt, der an dieser Adresse im Speicher liegt. In C passiert das mit dem Operator *. Bei einem Doppelzeiger liefert *p den gespeicherten Zeiger, und **p liefert den eigentlichen Datenwert.
  • Wie kann man einen Zeiger dereferenzieren?
    Einen Zeiger dereferenziert man in C, indem man vor den Zeigernamen * schreibt und so auf den Wert an der Zieladresse zugreift. Konkret: int x=5; int *p=&x; int y=*p; liest 5, und *p=7; schreibt 7 nach x.
  • Wie verwendet man Zeiger in Funktionen in C?
    Zeiger verwendet man in C in Funktionen, indem man die Adresse einer Variable übergibt, damit die Funktion den zugehörigen Speicherinhalt ändern kann. Soll die Funktion den Zeiger selbst umbiegen, übergibt man die Adresse des Zeigers, also einen Doppelzeiger, z. B. Aufruf f(&p) bei Parameter int **pp.
  • Wie gibt man den Speicher einer dynamisch reservierten Matrix mit Doppelzeiger wieder frei?
    Den Speicher einer dynamisch reservierten Matrix mit Doppelzeiger gibt man frei, indem man zuerst jede dynamisch reservierte Zeile freigibt und danach das Array der Zeiger. Konkret: for (int i=0;i und anschließend free(m);, wenn m als int **m angelegt wurde.

Zeiger verstehen

Doppelzeiger gehören zu den Zeigern und sind ein wichtiger Teil der Programmierung in C und C++. Wer sich mit Zeigern beschäftigt, arbeitet mit Adressen, Speicher und mehreren Ebenen von Verweisen. So wird klar, wie Daten im Arbeitsspeicher verbunden sind und warum ein Zeiger manchmal auf einen weiteren Zeiger zeigt. Im Informatikbereich findest du passende Videos zu diesem und verwandten Themen.

Lernen lohnt sich! Entdecke hier deine Chancen.