Pointertypen


Die Referenzen  auf Behälter für Werte eines Typs T bilden selbst  eine Klasse Ptr(T); ihre Instanzen nennt man auch Zeiger oder Pointer.

Auch in Modula können wir zu jedem gegebenen Typ <T> einen Pointertyp <PT> definieren:

TYPE <PT> = POINTER TO <T>;
Pointerwerte sind Bezüge auf Speicherobjekte, entstehen also erst zur Laufzeit unseres Programms; daher gibt es für sie auch keine Standardbezeichnungen. Eine Ausnahme bildet der Pointerwert NIL (anderswo auch: NULL oder void ); er ist in jedem Pointertyp vorhanden und bezieht sich auf gar nichts, ist aber wohldefiniert.

Auf Pointerwerten sind nur wenige Operationen definiert:

Die Dereferenzierung  eines Pointerwertes p wird p oder p (manchmal auch als p ->) geschrieben; dies bedeutet eine Variablenbenennung für den Behälter, auf den p verweist. Ist p kein legaler Pointerwert, verweist also p nicht wirklich  auf einen existierenden  Behälter, so spricht man von einem dangling pointer; ein Zugriffsversuch kann katastrophale Konsequenzen haben!

In Modula 2 und Pascal bekommen wir Pointerwerte als Referenzen auf neue  Speicherobjekte: ist p eine Variable eines Pointertyps <PT>, so erzeugt die Standardprozedur NEW(p) in einem eigenen  Speicherbereich, genannt die Halde (Heap) ein Speicherobjekt von dem Typ <T>, auf den die Pointerwerte in <PT> verweisen, und legt die Referenz in p ab. Die dadurch definierte dynamische Variable kann über die Benennung  p angesprochen werden und lebt so lange, bis wir sie mittels der Standardprozedur DISPOSE(p) wieder frei geben, oder bis zum Ende des Programmlaufes. Das gilt selbst dann, wenn uns zwischendurch alle Zugriffspfade auf das Objekt abhanden gekommen sind; und kommt dies zu oft vor, so kann die Halde erschöpft werden.

In C und verwandten Sprachen kann man eine Referenz auf eine Variable a in der Form &a erzeugen; das braucht man dort auch zur Simulation von Referenzargumenten, die es ansonsten nicht gibt. Dort bedeutet auch eine Benennung einer Arrayvariablen eine Referenz auf das erste Element des Array, und damit kann man sich Referenzen auf die weiteren Elemente berechnen; eine leider äußerst fehleranfällige Technik!


zurück | Inhalt | Index | vor | Vorlesung

Klaus Lagally, 22. Februar 2000, 19:36