|
| |
Nei linguaggi di programmazione (Pascal) abbiamo:
- tipi base non strutturati (predefiniti): interi, booleani, caratteri,...
- costruttori di tipi composti, che permettono la costruzione di tipi strutturati user-defined: array,record,...
Supponiamo per ora di non avere puntatori. Con questi ingredienti possiamo avere solo tipi statici:
la dimensione di un va 737i89h lore di tipo statico e' fissata, uguale per tutti, nota a compile time.
Dichiarazione di variabile:
var x: T;
Il compilatore sa gia' quanta memoria serve a contenere il valore di x, qualunque esso sara' durante l'esecuzione. L'allocazione delle variabili dichiarate e' fatta a compile time.
Necessita' di rappresentare tipi dove la dimensione e la struttura di un oggetto non e' prefissata.
La quantita' di memoria necessaria per il contenuto di una variabile non e' nota a compile time,
e puo' variare dinamicamente durante l'esecuzione;
- sequenze di elementi di lunghezza non prefissata (liste nelle molte varianti...)
- alberi
- grafi ....
Il compilatore non puo' allocare memoria a compile time, perche' non sa quanta ne servira', e perche' la quantita' di memoria necessaria varia a run-time.
Si possono usare strutture statiche (es. vedremo liste con array), ma bisogna aver fissato dimensione max degli oggetti e si spreca della memoria (che viene allocata ma non utilizzata).
Soluzione migliore:
Allocazione dimanica della memoria. Memoria allocata a run-time, quanta ne serve, accresciuta o diminuita nel tempo a seconda delle necessita'.
Nei linguaggi tipo Pascal, la possibilita' di allocazione dinamica e' associata all'uso di un nuovo strumento per accedere ai dati: il puntatore.
L'allocazione di una variabile è l'operazione con cui viene assegnata un'area della memoria alla variabile stessa. L'operazione inversa, detta deallocazione, consiste nel rendere di nuovo libera la memoria assegnata a una variabile in modo da poterla eventualmente usare per altri scopi. Le variabili viste finora usano i seguenti meccanismi di allocazione:
Entrambi questi meccanismi presentano degli inconvenienti: l'allocazione statica mantiene la memoria occupata per tutta la durata del programma, anche se la variabile deve essere usata solo per una frazione di tempo ridotta; l'allocazione automatica rilascia la memoria al termine del sottoprogramma, e quindi non consente di condividere la variabile tra sottoprogrammi invocati successivamente. Per questo motivo è stato introdotto un terzo meccanismo di allocazione, detto allocazione dinamica:
Per gestire un'informazione allocata
dinamicamente, il programma ha bisogno di mantenere, in una variabile
opportuna, un riferimento o puntatore a questa informazione, per
poter localizzare nella memoria l'area riservata al momento dell'allocazione.
Questo puntatore viene usato per le operazioni di allocazione e deallocazione,
e consente di accedere alla variabile dopo la sua allocazione.
Le altre operazioni definite sui puntatori sono:
Si noti che nel corso di un programma un
puntatore può essere usato per mantenere il riferimento a più variabili
dinamiche distinte.
Gli errori più frequenti che si verificano nella gestione delle variabili
dinamiche attraverso i puntatori sono:
La dichiarazione di tipo:
type TPTR = ^T; (dove T per ora possiamo pensarlo un tipo statico)
dichiara un nuovo tipo puntatore TPTR dove i valori di tipo TPTR sono indirizzi di
locazioni di tipo T, locazioni atte a contenere valori di tipo T.
Sapere il tipo dell'oggetto puntato permette di sapere
- la dimensione della cella puntata (e quindi la quantita' di memoria da allocare
quando viene richiesta l'allocazione dinamica)
- quali operazioni sono lecite sull'oggetto puntato (permette verifica di
correttezza statica, consistenza dei tipi)
E' una restrizione, ma permette un maggiore controllo di correttezza.
Nella dichiarazione type TPTR = ^T;
"^" e' un costruttore di tipo (parola chiave del linguaggio), come "array", "record".
In Pascal, se ho
type TPTR = ^T;
var p1: TPTR;
p2: ^T;
risulta che p1 e p2 hanno tipi fra loro incompatibili.
Differenza tra:
var x: T; x e' una variabile di tipo T.
x e' un nome simbolico che sta per l'indirizzo di una locazione di
tipo T. Il contenuto di x e' un valore
di tipo T. La memoria per x (= la locazione di tipo T il cui
indirizzo e' x) viene allocata staticamente dal compilatore.
var p: TPTR; p e' una variabile di tipo TPTR (puntatore a T).
p e' un nome simbolico che sta per l'indirizzo di una locazione
di tipo TPTR, ovvero una locazione che puo' ospitare indirizzi di locazioni di tipo T (le quali a loro volta potranno contenere valori di tipo T).
La memoria per p (= la locazione di tipo TPTR il cui indirizzo e' p e che conterra' indirizzi di locazioni di tipo T) viene allocata staticamente dal compilatore. Le locazioni di tipo T il cui
indirizzo sara' posto in p saranno allocare dinamicamente a run-time.
L'oggetto puntato da una variabile di tipo puntatore a T e' una variabile di tipo T.
Esistono dunque due tipi di variabili:
- variabili statiche:
dichiarate con var x: T; (T tipo qualsiasi, anche puntatore)
allocate staticamente e accedute per nome.
- variabili dinamiche:
non dichiarate, allocate dinamicamente e accedute tramite puntatori.
A seconda del compilatore, la dichiarazione di un puntatore
potrebbe coincidere con la sua inizializzazione implicita al valore NULL. Per
essere sicuri che un puntatore sia inizializzato, lo si può fare in modo
esplicito, come nell'esempio seguente:
Dovendo gestire degli oggetti dinamici, prima di utilizzare l'area di memoria a cui dovrebbe fare riferimento un puntatore, è meglio verificare che questo punti effettivamente a qualcosa.
Immaginate di sognare dei mostri che vi corrono dietro, con mille teste e la bocca aperta, con la voglia di mangiarvi: è quello che succede a Roberto, programmatore ingenuo, quando la notte va a dormire dopo aver mangiato pesante, e sa che il giorno dopo dovrà fare una verifica di informatica sui puntatori...
La mattina, a scuola, con la faccia distrutta si siede in classe davanti al computer senza neanche la forza di trascinare il mouse, inizia a programmare senza sapere il perché.Ma, se ormai i record non lo terrorizzano più di tanto, quello che non riesce a capire sono i puntatori. Le domande che si pone sono: funzionano veramente? Quando conviene usarli? Perché hanno una maniera così difficile di essere usati?
Studente Roberto V. Miccoli 4° Info B
|
Privacy |
Articolo informazione
Commentare questo articolo:Non sei registratoDevi essere registrato per commentare ISCRIVITI |
Copiare il codice nella pagina web del tuo sito. |
Copyright InfTub.com 2025