Ma_fack di Ma_fack
Ominide 1415 punti

I Puntatori

La memoria del calcolatore è divisa in Stack e Heap.
Nello Stack, o memoria statica, sono immagazzinate tutte le variabili, come la classica x. Nell’Heap, o memoria dinamica, vi è la possibilità di allocare ma anche di de-allocare la memoria. Questa manipolazione dell’heap avviene proprio grazie ai puntatori.
Un puntatore è una variabile che contiene l’indirizzo di memoria di un’altra variabile. Per assegnare ad un puntatore ( p_x ) l’indirizzo di una variabile ( x ) si usa il simbolo &, quindi si avrà:

p_x = & x ;

come si può vedere dall’immagine sopra, se immaginiamo che x sia una variabile intera assegnata all’indirizzo di memoria 7500, se p_x fa riferimento alla cella di x, p_x conterrà infine 7500.
Se si vuole accedere al contenuto di un puntatore bisognerà invece utilizzare il simbolo ( * ). Quindi scrivendo:

p_x = & x;
*p_x = 20;

non facciamo altro che connettere p_x all’indirizzo della cella di memoria in cui si trova x. Successivamente assegniamo il valore 20 al puntatore p_x che punta alla cella di memoria di x. Pertanto infine avremo x = 20.
Quindi sarà indifferente scrivere: x = 20 o *p_x = 20

Per definire una variabile di tipo puntatore è necessario dichiarare il tipo di variabile puntatore, ossia a che tipo di variabile il puntatore faccia riferimento, seguito da un *. Quindi una dichiarazione di esempio può essere:

int *p_x; char *p_x; double *p_x;

Bisogna stare molto attenti al tipo di variabile che assegniamo infatti se il puntatore puntasse a variabili di tipo differente da quello dichiarato si potrebbero avere alcuni problemi!!!!

Per quanto riguarda invece l’inizializzazione di un puntatore questa avviene col comando &, come visto precedentemente. Tuttavia è buona norma inizializzare il puntatore a NULL, cioè a nessuna cella di memoria.
Se volessimo invece inizializzare il puntatore ad un valore dovremmo scrivere: p_x = new int (20)

Ricorda inoltre che agendo nello Slack si può andare incontro al memory leak. E’ quindi necessario distruggere il puntatore prima di riutilizzarlo e questo va fatto col comando “delete p_x;”.


Puntatori ed Array sono strettamente legati fra loro. Infatti un Array è semplicemente un valore costante che indica l’indirizzo del primo elemento del vettore. Pertanto un puntatore è simile ad un Array. Infatti se:

float f_array[MAX_size];
float* f_array2;
f_array2 = f_array;

allora si ha l’equivalenza: f_array2 = & f_array[0];

Utilizzare i puntatori però portano anche ad alcuni errori. Tra i più frequenti abbiamo:
- Puntatori non inizializzati = se saltiamo il codice con &.
- Comparazione tra puntatori non valida;
- Dimenticare di “resettare” un puntatore = se siamo in un ciclo;

‘ * ‘ = riguarda il contenuto
‘ & ‘ = riguarda l’address

Hai bisogno di aiuto in Informatica?
Trova il tuo insegnante su Skuola.net | Ripetizioni
Registrati via email