Programmierkurs: Delphi: Pointer

Einleitung

Bearbeiten
 
Der RAM als Modell

Betrachtet man den RAM, so fällt folgende Struktur auf:

Der RAM[1] ist unter den verschiedenen Anwendungen und dem Betriebssystem aufgeteilt; Den RAM, den eine Anwendung verbraucht, kann man wiederum in Heap und Stack unterteilen. Im Stack werden alle Variablen gespeichert, die z.B. mit var i: Integer; deklariert worden sind. Das Problem am Stack ist, dass er in der Größe sehr beschränkt ist. Bei großen Datenstrukturen sollte man daher auf den Heap zurückgreifen. Dazu benötigt man Zeiger (Pointer).

Grundlagen

Bearbeiten
 
Ein Zeiger in den Heap

Ein Pointer ist in der Regel 4 Bytes groß, d.h. es lohnt sich normalerweise nicht, einen Pointer auf einen Bytewert zu erzeugen, da dieser nur einen Byte belegt! Ein Pointer auf eine bestimmte Datenstruktur wird folgenderweise definiert:

var
  zgr: ^TDaten;

Einem Pointer muss immer ein Wert zugewiesen werden! Für den Fall, dass ein Pointer vorerst nicht gebraucht wird, kann ein Zeiger auch ins Leere zeigen, dies geschieht mit der Zuweisung:

zgr := nil; // nil = not in list

Bevor man den Zeiger allerdings auf Daten zeigen lassen kann muss man zuerst Speicher im Heap reservieren:

New(zgr);

Nun kann man auf die Daten zugreifen, als wäre es eine normale Variable, allerdings hängt man dem Zeigernamen beim Zugriff ein Zirkumflex (^) hinten an:

zgr^ := 50000;

Dies ist nötig, da in zgr selber die Anfangsadresse von zgr^ im Heap gespeichert ist. Wenn TDaten allerdings ein Record ist, so kann man theoretisch beim Zugriff auf die einzelnen Unterpunkte den Zirkumflex weglassen:

zgr.nummer := 1;

Wenn man einen Pointer im weiterem Programmverlauf nicht mehr braucht, dann sollte man unbedingt den belegten Speicher wieder freigeben:

Dispose(zgr);

Mit diesen Grundlagen sollte das Kapitel über Listen, Bäume und Schlangen eigentlich kein Problem mehr darstellen!

Weiterführende Literatur

Bearbeiten
  1. RAM: siehe http://de.wikibooks.org/wiki/Computerhardware:_RAM


  Datentypen Inhaltsverzeichnis Dynamische Datenstrukturen