Programmiersprache Pascal

Zeiger-Datentypen

Zeiger (pointer) sind wesentlich für die Arbeit mit dynamischen Variablen:
Benötigter Speicherplatz kann operativ zur Laufzeit angefordert werden.

Zeiger-Datentypen werden wie folgt vereinbart:

  TYPE name = ^basistyp;

Dynamische Variablen können folgendermaßen deklariert werden:

  VAR zeiger_variable : zeiger_typ;
                                        oder
      zeiger_variable : ^basistyp;
Bemerkung:
Mitunter wird auch @ anstelle von ^ verwendet.
Achtung:
In den Borland Pascal Systemen wird - im Widerspruch zum Pascal Standard - @ als Adreßoperator verwendet (siehe weiter unten).

Beispiel 1:

  VAR pi : ^INTEGER;

  New(pi);       { Speicherplatzanforderung }
  pi^ := 7;
Beispiel 2:
  TYPE pinteger = ^INTEGER;
  VAR pi : pinteger;

  New(pi);       { Speicherplatzanforderung }
  pi^ := 7;
Anweisungsreihenfolge

Die Regel, daß in Deklarationsanweisungen nur auf Datentypen Bezug genommen werden darf, die zuvor definiert wurden, läßt in Bezug auf Zeiger eine Ausnahme zu:
Der Basisdatentyp einer Zeigervariablen darf nachfolgend definiert werden, vorausgesetzt, dies geschieht innerhalb des gleichen Blocks.

Beispiel:

  TYPE prec = ^rec;
       rec  = RECORD
                id : INTEGER;
                name : PACKED ARRAY[1..20] OF CHAR;
                next : prec;
              END;
Diese Regelung ist notwendig, um rekursive Datenstrukturen wie Listen, Bäume, usw. definieren zu können.


Zuordnung von Speicherplatz zu einer dynamischen Variablen

Die Zuordnung von Speicherplatz zu einer dynamischen Variablen wird wie folgt vorgegangen:

  New(zeiger_variable);
Der Wert der Variablen ist - nach erfolgreicher Speicherplatzanforderung - die Adresse des zugewiesenen Speicherbereiches.

Der zugewiesene Speicherplatz kann zur Ablage eines Wertes vom Typ basistyp verwendet werden.

Achtung:
Der zugewiesene Speicherplatz wird im allgemeinen nicht initialisiert !
Da im Speicher jedoch immer "irgendetwas" steht, verweist die Zeigervariable zunächst auf einen zufälligen Wert.

Um anzuzeigen, daß kein Speicherplatz zugewiesen wurde, existiert eine spezielle Konstante:

  NIL
Dynamisch angeforderter Speicherplatz sollte, wenn er nicht mehr benötigt wird, so bald als möglich wieder freigegeben werden.
Dies kann wie folgt geschehen:
  Dispose(zeiger_variable);
Auf eine Zeiger-Variable können folgende Operatoren angewendet werden:
  =      verweisen die Zeiger auf das gleiche Objekt ?
  <>     verweisen die Zeiger auf verschiedene Objekte ?
Weitere Operatoren sind in Pascal nicht auf Zeiger anwendbar.
Eine Zeiger-Arithmetik, wie sie z.B. in der Programmiersprache C üblich ist, gibt es in Pascal nicht.


Zugriff auf dynamisch angeforderten Speicherbereich

Auf den Wert, der im Speicherbereich befindet, auf den eine Zeigervariable verweist, kann folgendermaßen zugegriffen werden:

  zeigervariable^
Beispiel:
  TYPE pint = ^INTEGER;
  VAR p : pint;
  BEGIN
    New(p);
    p^ := 1;
    Writeln(p^);
  END;

Ermittlung von Adressen

Der Zugriff auf Adressen ist weder in Standard Pascal noch in Extended Pascal vorgesehen.

Turbo Pascal, Delphi

In Turbo Pascal existiert ein Adreßoperator:

  @name
Achtung:
In anderen Pascal-Versionen kann @ alternativ zu ^ verwendet werden und hat damit eine andere Bedeutung !

Turbo Pascal, Delphi, XL Pascal

Die Adresse einer Programmgröße kann mit Hilfe der Funktion Addr ermittelt werden:

  Addr(name)
Beispiel 1:
Der Wert eines Wertparameters einer Prozedur wird modifiziert
modifiziert wird der Wert einer Kopie des Aufrufparameters
  PROCEDURE value(x: INTEGER);
  VAR ptr := ^INTEGER;
  BEGIN
    ptr  := @x;
    ptr^ := 15;                 { entspricht  x := 15;  }
  END;
Beispiel 2:
Der Wert eines Referenzparameters einer Prozedur wird modifiziert
modifiziert wird der Wert des Aufrufparameters
  PROCEDURE var(VAR y: INTEGER);
  VAR ptr = ^INTEGER;
  BEGIN
    ptr  := @y;
    ptr^ := 15;                 { entspricht  y := 15;  }
  END;

Prüfung der Belegung eines Zeigers

Der Wert eines Zeigers

Für einen Zeiger p kann durch den Vergleich p = NIL ermittelt werden, ob der Zeiger auf keine Adresse verweist.
p <> NIL bedeutet, daß eine Adresse zugewiesen wurde. Der Test gibt jedoch keine Auskunft darüber, ob die Adresse zulässig ist.

Die Unzulässigkeit einer Adresse kann bedeuten:

Delphi

Der Test, ob ein Zeiger den Wert NIL besitzt, kann auch mit Hilfe der Funktion Assigned ausgeführt werden.
Mit Assigned können außerdem Prozedurvariablen getestet werden.


Ungetypte Zeiger

Die Pascal-Standards sehen - aus Sicherheitsgründen - vor, daß Zeiger immer an einen Datentyp gebunden sein müssen.

Einige Pascal-Systeme sehen allerdings Ausnahmen vor: Ungetypte Zeiger



P. Böhme, 19.07.1996