Home » Tipps & Tricks » Sonstiges » Sonstiges » Pointer

Pointer

Pointer sind im Prinzip Integer-Zahlen, die auf bestimmte Stellen im Speicher zeigen. Mit ihrer Hilfe ist es möglich, an den Inhalt der Stelle zu kommen, auf die gezeigt wird.In Delphi haben Pointer für den Programmierer eher eine untergeordnete Rolle, aber Objekte, Strings… sind eigentlich nur Pointer auf einen Bereich im Speicher. Hierbei wird der Zugriff aber von Delphi verwaltet. In anderen Sprachen, wie C++, ist die Anwesenheit von Pointern viel offensichtlicher.Erst mal ein kleines Beispiel zu Pointern aus der OH:

var
  X, Y: Integer;// X und Y sind Integer-Variablen
  P: ^Integer;  // P zeigt auf einen Integer
begin
  X := 17;      // Einen Wert an X zuweisen
  P := @X;      // Adresse von X an P zuweisen
  Y := P^;      // P dereferenzieren; Ergebnis an Y zuweisen
end;

Zuerst werden zwei Integer-Variablen deklariert. Dahinter folgt ein Pointer, der auf eine Integer-Zahl zeigt. Zeiger auf einen bestimmten Typ deklariert man durch das ^-Zeichen, gefolgt vom eigentlichen Typen.Nach dem Begin wird X eine Zahl zugewiesen. Jetzt folgt die erste Operation mit Pointern. P wird die Adresse im Speicher von X zugewiesen. Dies geschieht über den Operator @, mit folgender Angabe der Variablen. Nun wird Y der Inhalt der Variablen zugewiesen, auf die P zeigt. Um Zugriff auf den Inhalt zu erhalten, auf den ein Pointer zeigt, benutzt man das ^-Zeichen nach dem Pointer.Um einen Pointer zu erhalten, der auf alle Arten von Strukturen zeigt, benutzt man den Typen Pointer, für den Pointer. Weiterhin ließe sich ^Integer durch PInteger ersetzen, da es für alle wichtigen Typen Pointer gibt, die ganz einfach deklariert sind:

type
  PInteger = ^Integer

Wenn Pointer erzeugt wird, zeigt er auf einen Bereich im Speicher. Es ist aber auch möglich, ein Pointer auf nichts zeigen zu lassen. Dies geschieht durch die Zuweisung von nil an den Pointer:

P:=nil;

Dadurch ist es möglich, zu erfahren, ob ein Pointer zugewiesen wurde. Nach dem Anlegen eines Pointers zeigt dieser aber auf einen zufälligen Bereich im Speichern und nicht auf nil.Durch die Procedure New und Dispose, die jeweils einen Pointer als Parameter benötigen, kann man Speicher für den Pointer reservieren. Durch New wird eine dynamische Variable angelegt, mit Dispose wieder freigegeben. Dies sollte man in betracht ziehen, wenn ein großer Speicherplatz nur für eine kurze Zeit benötigt wird. Das Anlegen von dynamischen Variablen lohnt sich vor allem bei arrays und Großen Datentypen.

type TRiesenArray=array[0..BIG_NUMBER,0..BIG_NUMBER] of Int64;
var p: ^TRiesenArray;
    i,j:Integer;
begin
  New(p);
  for i:=0 to BIG_NUMBER
    do for j:=0 to BIG_NUMBER
      do p^[i,j]:=i*j;
  Dispose(p);
end;

New und Dispose kann man auch benutzen, um verkette Strukturen anzulegen. Hierbei enthält ein Datenelement sowohl die Daten als auch einen Pointer auf das nächste oder auch das vorhergehende Element. Aber normalerweise kann man sich diese Mühe mit Hilfe von TList ersparen.TList ist ein dynamisches Array von Pointern. Mit ihm lassen sich mehrere Pointer verwalten und sortieren.Zusammengefasst lässt sich sagen, dass Pointer in Delphi wenig Bedeutung haben und selten vorkommen. Trotzdem kann man mit ihnen Speicherschonend Variablen anlegen.