typ [parameter] [,attribute], POINTER :: name [...]Die Ziele von Zeigern sind dann entweder Variable (mit dem TARGET-Attribut) oder aber selbst wieder Zeiger:
typ [parameter] [,attribute], TARGET :: name [...]Pointer können z.B. verwendet werden, um Alias-Namen für Datenobjekte, vor allem für Teilobjekte, zu vergeben:
REAL, POINTER, DIMENSION(:,:) :: oben, unten REAL, TARGET, DIMENSION(10,10) :: matrix ... oben => matrix(1:5,1:5) unten => matrix(6:10,6:10) ... DO j = 1, 5 DO i = 1, 5 READ (*,*) oben(i,j) END DO END DO ...
Die sinnvollste Verwendung von Pointern ist aber wohl der Aufbau von verketteten Listen, d.h. Datenstrukturen, die beliebig wachsen, aber auch wieder schrumpfen können, mit dem Befehl NULLIFY wird dabei eingetragen, daß der Zeiger (noch) auf kein weiteres Element der Liste zeigt, mit ASSOCIATED kann man abfragen, ob ein Zeiger auf etwas zeigt oder nicht:
PROGRAM kette
TYPE adresse ! selbstdefinierter Typ
CHARACTER*30 :: vorname, nachname ! aus 2 Character-Strings,
INTEGER :: tel_nummer ! einer Integer-Zahl und
TYPE(adresse), POINTER :: next ! einem Zeiger (auf die
END TYPE adresse ! selbe Datenstruktur)
TYPE (adresse), TARGET :: first ! Ziel wird das erste,
TYPE (adresse), POINTER :: jetzt, last ! Pointer das aktuelle
! und das letzte Element
last => first ! das letzte Element zeigt
! zu Beginn auf den Anfang
NULLIFY (last%next) ! der Zeiger auf das naechste
! Element zeigt vom letzten
! Element am Anfang auf nichts
DO ! Endlosschleife
WRITE (*,'(A)') 'naechste Adresse (Beenden mit Ctrl-D): '
ALLOCATE (jetzt) ! reserviere Speicher fuer
! die naechste Eingabe
WRITE (*,'(A)', ADVANCE='NO') 'Vorname: '
READ (*,*,IOSTAT=iostat) jetzt%vorname ! Lies die Werte auf das
if (iostat /= 0) EXIT ! aktuelle Element ein
WRITE (*,'(A)', ADVANCE='NO') 'Nachname: '
READ (*,*) jetzt%nachname
WRITE (*,'(A)', ADVANCE='NO') 'Telephonnummer: '
READ (*,*) jetzt%tel_nummer
NULLIFY (jetzt%next) ! der Zeiger des aktuellen
! Elements zeigt auf nichts
last%next => jetzt ! der Zeiger des bisher letzten
! Elements zeigt nun auf das
! aktuelle Element
last => jetzt ! der Zeiger "letztes Element"
! zeigt nun auf das aktuelle
! Element
WRITE (*,*)
END DO
WRITE (*,'(A)') 'Liste wuerde jetzt z.B. sortiert ...'
WRITE (*,'(A)') 'Ausgabe der Liste: '
jetzt => first ! das aktuelle Element zeigt
! auf den Beginn der Liste
DO
IF (.NOT. ASSOCIATED (jetzt%next)) EXIT ! falls das aktuelle Element
! auf nichts mehr zeigt ist
! das Listenende erreicht
jetzt => jetzt%next ! geh zum naechsten Element
! und gib die Daten aus
WRITE (*,'(A)',ADVANCE="NO") TRIM(ADJUSTL(jetzt%vorname))//" "
WRITE (*,'(A)',ADVANCE="NO") TRIM(ADJUSTL(jetzt%nachname))//" "
WRITE (*,*) jetzt%tel_nummer
END DO
END PROGRAM