Allocazione dinamica: variabili POINTER

Un discorso simile a quello delle variabili ALLOCATABLE, vale anche per le variabili con l'attributo POINTER: in particolare anche esse possono essere allocate e deallocate con le stesse istruzioni.

A differenza delle variabili ALLOCATABLE, le variabili con l'attributo POINTER non devono essere necessariamente array, e, in alternativa ad essere allocate, possono anche essere fatte puntare (o "associate") ad una variabile di tipo corrispondente già esistente (ivi compreso un array o una sezione di array), tramite l'operatore =>. Lo stato di associazione di una variabile POINTER si controlla con la funzione ASSOCIATED() (non ALLOCATED()!!); attenzione che all'inizio dell'esecuzione di un programma, le variabili POINTER si trovano in uno stato indefinito, per cui non ha senso usare su di esse la funzione ASSOCIATED() prima di prima di rendere il puntatore "disassociato" tramite la funzione NULLIFY() o prima di associare il puntatore tramite la ALLOCATE() o l'operatore =>.

In F95 è anche possibile utilizzare la funzione intrinseca NULL() per nullificare un puntatore direttamente nella sua dichiarazione attraverso l'operatore =>.

Affinché una variabile possa essere puntata da un POINTER, deve avere l'attributo TARGET che serve per comunicare al compilatore di evitare eventuali ottimizzazioni pericolose.

Un tipo derivato (TYPE) può contenere membri di tipo POINTER ad array; questo permette, ad esempio, di definire un vettore di tipi, ciascun elemento del quale contiene a sua volta un vettore con lunghezza diversa; non è invece possibile usare l'attributo ALLOCATABLE nei membri di un tipo (lo sarà in F2003).

Un tipo derivato (TYPE) può contenere anche membri di tipo POINTER ad un tipo derivato uguale al tipo stesso; questo permette di costruire strutture ad albero o di tipo linked list come con il linguaggio C.

PROGRAM puntatur
INTEGER, TARGET :: s, a(3,6)
INTEGER, POINTER :: ps, pa(:,:)

s = 3
ps => s
ps = 2
ps => NULL()

a = 1
PRINT*,'Prima:'
PRINT*,a

pa => a(:,::2)
pa = 2
PRINT*,'Dopo:'
PRINT*,a 

END PROGRAM puntatur

Attenzione, esistono delle estensioni non standard al Fortran 77 per gestire i puntatori (denominate in genere "Cray pointers") che hanno un sintassi diversa da quella descritta e sono assolutamente da evitare perché non supportate dallo standard F90.