La notazione grafica

La notazione usata fino a questo momento per visualizzare il contenuto della memoria è quella in cui la memoria viene vista come una serie di rettangoli (uno per ogni byte) l'uno sopra l'altro, con le frecce per indicare che un puntatore contiene un certo indirizzo. Per le liste, questo metodo di visualizzazione può risultare scomodo.

La figura di sopra può sembrare abbastanza chiara. Occorre però tenere presente che non c'è nessuna garanzia della posizione relativa fra gli elementi: potrebbero anche essere messi cosí:

Ripetiamo, ancora una volta, che le freccie sono una notazione: in realtà, nei campi puntatore ci sono degli indirizzi, ossia dei numeri. La freccia indica solo dove si trova l'indirizzo contenuto in un puntatore. Per esempio, si può confrontare l'esempio di sopra usando la freccia e dei numeri di esempio. La freccia è più chiara, ma non va mai dimenticato che in effetti i puntatori sono numeri.

Introduciamo ora una nuova notazione grafica per rappresentare lo stato della memoria quando sono presenti liste e strutture. Il metodo dovrebbe essere già chiaro dall'esempio qui sotto.

Ogni variabile si rappresenta con un rettangolo, e ogni struttura è rappresentata disegnando le sue componenti attaccate. La freccia indica come al solito che un puntatore contiene l'indirizzo in cui si trova un'altra variabile (che può essere di qualsiasi tipo, ad esempio di tipo scalare, oppure struttura). Usiamo la croce per indicare il valore NULL.

Si tenga ancora presente che si tratta di un modo per visualizzare quello che c'è nella memoria. In effetti, ogni rettangolo è un blocco di byte, e le freccie indicano la locazione scritta in un puntatore.

Facciamo vedere come questa notazione sia molto più comoda della precedente per rappresentare operazioni su liste. Consideriamo come esempio l'aggiunta di un elemento in testa, con questa nuova notazione. La prima cosa è la allocazione di una nuova struttura. Questo corrisponde a disegnare una nuova coppia di rettangoli, che rappresentano la nuova struttura.

t=malloc(sizeof(struct NodoLista));
      

Viene poi scritto il valore -5 nel campo val della struttura puntata da t:

(*t).val=-5;
      

Occorre fare attenzione alla assegnazione (*t).next=l. Questo significa che i due puntatori contengono lo stesso indirizzo. Quindi, le freccie che usiamo per indicare gli indirizzi devono convergere sulla stessa locazione, che è quella di arrivo della freccia di l. Quello che risulta in questo caso è:

(*t).next=l;
      

Per lo stesso motivo, quando si esegue l=t le freccie che partono da l e da t devono andare nello stesso punto. In particolare, la freccia di l deve andare verso il punto indicato dalla freccia di t.

l=t;
      

Questa è la lista (-5 2 -9 1): per capirlo basta seguire i puntatori (infatti, la lista si ottiene seguendo le freccie da struttura a struttura, mentre la posizione nella figura non conta).

Questa nuova notazione permette di disegnare liste collegate in modo più facile. Va comunque tenuto presente che le freccie sono comunque puntatori, ossia numeri, e che la freccia è solo un modo comodo per indicare la locazione il cui indirizzo è memorizzato in un puntatore.