next up previous contents
Nächste Seite: Initialisierungen Aufwärts: Vereinbarungsanweisungen Vorherige Seite: Dynamische Felder   Inhalt


Zeiger und Ziele

Zeiger - also, eine Variable, die mit dem POINTER-Attribut versehen wurde - sind, wie bereits erwähnt, keine Variablen im eigentlichen Sinne. Sie dienen nicht zur Aufnahme von Rechendaten, sondern bieten dem Programmierer die Möglichkeit, Adressen im Arbeitsspeicher anzusprechen. Man sagt, sie zeigen darauf. Ist das Ziel eines Zeigers gesetzt worden, kann mit dem zugeordneten Speicherbereich gearbeitet werden, wie bei allen anderen Variablen auch. Es können Werte abgelegt, verändert und ausgelesen werden.

Unter Fortran95 gibt es für einen Zeiger zwei Möglichkeiten eine Speicheradresse festgelegt zu bekommen. Zum einen kann ein Zeiger auf eine Adresse zeigen, die bereits einer anderen Variablen zugeordnet ist, zum anderen kann ihm aber auch ein eigener (und somit zuvor freier) Speicherplatz zugewiesen werden.

Zeiger auf eine Variable

Ein Zeiger kann nur auf eine andere Variable zeigen, wenn für diese das TARGET-Attribut gesetzt, sie also als Zeigerziel deklariert wurde. Die Zuweisung der Variable als Ziel erfolgt dann mit Hilfe einer Zeigerzuweisungs-Anweisung ().

Beispiel:

      REAL, TARGET  :: zahl             ! ein REAL-Variable, die Zeigerziel sein kann
      REAL, POINTER :: zeigaufzahl      ! ein Zeiger auf eine Variable vom Typ REAL

      zahl = 0.
      zeigaufzahl => zahl               ! 'zeigaufzahl' soll 'zahl' als Ziel haben

      PRINT*, zeigaufzahl               ! gibt  '0.'  auf dem Bildschirm aus
      zeigaufzahl = 7.3
      PRINT*, zahl                      ! gibt  '7.3' auf dem Bildschirm aus

In unserem Beispiel haben wir eine REAL-Größe namens deklariert, die auch das TARGET-Attribut besitzt. Somit kann auch als Ziel eines Zeigers benutzt werden. Der Zeiger zeigaufzahl ist auch vom Typ REAL, und kann somit als Zeiger auf REAL-Größen verwendet werden. Mit haben wir als Ziel von zeigaufzahl festgelegt. Somit zeigt zeigaufzahl auf zahl. Als wir den Wert von zeigaufzahl auf $7.3$ gesetzt haben, hat sich dadurch auch der Wert von zahl auf $7.3$ geändert, da beide symbolische Namen die gleiche Adresse im Speicher ansprechen.

Um den Zeiger von seinem Zeigerziel wieder zu trennen, kann die Anweisung


		  

verwendet werden. Jedoch würde jede Neuzuordnung eines Zeigers zu einem Ziel bereits implizieren, daß die vorangegangene Zuordnung damit aufgehoben ist.

Zeiger auf eigenen Speicherplatz

Ähnlich wie bei dynamischen Feldern kann die Vergabe von Speicher an Zeiger gesehen werden. Daher ist es auch nicht weiter verwunderlich, daß hierbei auch nahezu die gleichen Anweisungen verwendet werden. Mit


		  

kann einem Zeiger (oder auch mehreren gleichzeitig) Speicherplatz zugewiesen werden. Dabei wird dem Zeiger abhängig von seinem Typ Speicher zugeteilt und kann anschließend wie eine gewöhnliche Variable dieses Typs behandelt werden. Die korrekte Abbarbeitung der Anweisung kann wie bei den dynamischen Felder unter 4.2.3.5 abgefragt werden.

Um den Speicherplatz eines Zeigers wieder freizugeben verwendet man auch hier die Anweisung


		  .

Um den Zuordungsstatus eines Zeigers zu erfragen existiert die vordefinierte Funktion ASSOCIATED(zeiger), die TRUE als Rückgabewert liefert, falls dem Zeiger ein Ziel zugewiesen ist.

Allgemein sollte aber noch gesagt sein, daß niemals ein Zeiger verwendet werden sollte, der nicht bereits ein Ziel zugewiesen bekommen hat. Um etwaige Fehler innerhalb eines Programmablaufs auszzuschließen empfiehlt es sich, jeden Zeiger mit dem Rückgabewert der Funktion NULL() zu belegen


		   

,um diesen als nicht-zugewiesen festzulegen!


next up previous contents
Nächste Seite: Initialisierungen Aufwärts: Vereinbarungsanweisungen Vorherige Seite: Dynamische Felder   Inhalt
Lars Tornow 2003-03-31