Index

Datentypen (9)


Zeiger-Typ

1. Einführung

Die bisher behandelten Datentypen besitzen einen gravierenden Nachteil:
Sie sind statisch, d.h. es ist vor Ablauf des Programmes, zur sogenannten Entwurfszeit, festgelegt, wo die zugehörigen Daten abgelegt werden. Daher muss auch ihr Typ (Zahlart, Zeichen, Zeichenkette, Feld von Datenart usw.) genau bekannt sein, damit der Compiler entsprechend Speicherbereich reservieren kann.

In der Praxis ist aber oft die Datenmenge im voraus unbekannt. Verwaltet man z.B. eine Adress-Datei, so ist das Problem, dass man nicht weiß, wie viele Adressen es eines Tags sein werden. Auf der einen Seite verschenkt man viel Speicher, wenn man die Grenze zu hoch ansetzt, auf der anderen Seite kann es passieren, dass der vorgesehene Speicher irgend wann einmal nicht mehr ausreichend ist. Der Programmierer muss dann in den Quellcode eingreifen und die entsprechenden Definitionen, z.B. den Feldindex, ändern. Danach muss das Programm neu compiliert und gegebenenfalls ausgeliefert werden.
Dies ist sicher keine gute Praxis.

Die Lösung bietet ein Typ namens Zeiger (pointer).

Der Zeiger-Typ stellt zunächst einmal keinen Datenbereich zur Verfügung. Variablen dieses Typs enthalten lediglich eine Adresse, die eine bestimmte Stelle im Datenspeicher referenziert.

Mit Zeigervariablen lassen sich nun aber während der Laufzeit bestimmte Speicherbereiche belegen, dessen Anfangsadresse in der Zeigervariable enthalten ist. Man sagt auch, auf dessen Anfangsadresse diese zeigt. Hiervon leitet sich auch der Name Zeiger ab.

Es ist nun möglich während des Programmlaufs beliebig Speicher für Daten zu reservieren und, wenn dieser nicht mehr benötigt wird, wieder freizugeben. Der Speicher kann damit dynamisch verwaltet werden. Der betreffende Speicherbereich, der hierfür verwendet wird, heißt auch Halde (heap). Er ist im Prinzip nur durch den Arbeitsspeicher des Rechners begrenzt.

Zeiger und Referenz zum Heap

Die Zeigervariablen selbst sind statische Variablen, belegen nur wenig Speicher (4 Byte), können aber beliebig große Datenbereiche referenzieren.

Es gibt zwei Typen von Zeigern:

[Zeigertyp in Object-Pascal]


Soll nun eine größere Menge von Daten angelegt werden, z.B. wie schon erwähnt etwa eine Adressen-Datei, so würde man nun für jede Adresse eine Pointer-Variable benötigen, also wiederum eine große Menge statischer Variablen, etwa als Feld. Damit wäre das Problem der festen Adressenanzahl immer noch nicht gelöst. Lediglich die Daten wären zum großen Teil aus dem relativ kleinen Programmbereich in den Heapbereich verschoben.

Die Stärke der Zeigervariablen liegt nun gerade darin, dass auch diese selbst auf dem Heap angelegt werden können und dies eben nur bei Bedarf, so dass tatsächlich nur soviel Speicher benötigt wird, wie auch Daten verwaltet werden sollen.

Diese Technik führt zu zwei Varianten, nämlich

Die Unterschiede liegen hierbei aber nur in der Dimension. Eine Liste baut sich linear auf, während bei Bäumen Verzweigungen vorliegen.

 

[Index] [Zurück/Datentypen 8] [Fortsetzung/Listen]


Autor: Jürgen Dehmer
Letzte Änderung: 10. Februar 2001