Doppelzeiger
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.
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.
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.
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.
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:
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:
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.
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!