Zeiger (Pointer)

Ein Pointer zeigt auf die Adresse einer Variablen, Funktion oder Prozedur. Ein Zeigervariable besteht aus je zwei 16-Bit-Werten, der Segment- und der Offset-Adresse. Eine Zeigervariable benötigt demnach immer 4 Byte Speicherplatz. Man unterscheidet zwischen typisierten und untypisierten Zeigern.  Hier sollen zunächst die typisierten Zeiger interessieren:

var
  s : string;
  ps : ^string;
  n : integer;
  pn : ^integer;
  ds : TDatensatz;
  pds : ^TDatensatz;
  
Nach Delphi-Konvention beginnen die Bezeichner für Zeigervariable mit einem vorangestellten p. Aus der obigen Variablen-Deklaration erkennt man, was der Begriff 'typisiert' bedeutet und wie man einen typiserte Zeigervariable deklariert. Im laufenden Programm wird der ('normalen') Variablen ein Wert zugewiesen. Danach referenziert man den Zeiger mit Hilfe des Zeiger-Operators @

procedure TForm1.FormCreate(Sender: TObject);
begin
  s := 'otto'; ps := @s;
  n := 28 ; pn :=@n;
  with ds do begin
    name := 'Meier'; vorname := 'Otto'; alter := 27;
  end;
  pds := @ds;
end;

Will man später den in der Adresse gespeicherten Wert auslesen (dereferenzieren), dann geschieht das wie folgt:

procedure TForm1.Button1Click(Sender:TObject)
begin
  Edit1.Text := ps^;
  Edit2.Text := IntToStr(pn^);
  Edit3.Text := ds^.name;
  Edit4.Text := IntToStr(ds^.alter);
end;

Um Zeiger (und den zugehörigen Speicherplatz) dynamisch zu erzeugen, verwendet die Speicherreservierungs-Funktion new(),wie das folgende Beispiel zeigt:

procedure TForm1.Button4Click(Sender: TObject);
var pds : ^TDatensatz;
    ds : TDatenSatz;
begin
  Assignfile(datei,'otto.db');
  reset(datei);
  while not eof(datei) do begin
  inc(dsz);
    read(datei,ds);
    new(pds); pds^ := ds;
    DatenListe.Add(pds);
  end;
CloseFile(datei);
end;

Dabei ist DatenListe  eine Instanz vom  der Delphi-Klasse TList, ein Behälter der mit ähnlichen Methoden wie die Klasse TStringList (z.B.: Add, Clear, Delete, Insert) Pointer verwalten kann.

Das Programm pointer.pas zeigt noch einmal das Arbeiten mit Zeigern. 

Aufgaben:

 

Zurück zu Delphi

© Dietrich Praclik