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;
Das Programm pointer.pas zeigt noch einmal das Arbeiten mit Zeigern.
Aufgaben:
© Dietrich Praclik