I puntatori sono di importante spessore nella programmazione in C poiché mediante il loro impiego nel codice, possiamo lavorare ad un livello “basso”, ossia lavorare con indirizzi fisici dell’elaboratore e strutture dati con una facilità a dir poco incredibile.
Ma facciamo un piccolo passo indietro… La memoria del calcolatore, è formata da tante locazioni numerate da 0 a N-1. Per poter localizzare ciascuna locazione, è necessario un indirizzo che identifichi la locazione. Quindi per poter scrivere o leggere qualcosa in memoria centrale è necessario sapere quale è il punto esatto in cui si compirà l’azione.
Ma precisamente cosa è un puntatore? E’ una variabile che contiene l’indirizzo di memoria di un’altra variabile. Per cui se abbiamo una variabile di nome ‘a’, essa verrà collocata in una determinata posizione in memoria; supponiamo che sia stata collocata nella posizione 10. Un puntatore conterrà, appunto, il valore 10.
Ricordiamo inoltre che entrambi (sia puntatore, sia variabile) possono essere manipolati.
Per dichiarare un puntatore è necessario anteporre il simbolo * al nome del puntatore stesso:
L’asterisco * è chiamato operatore di indirezione o deferenziazione e restituisce il contenuto dell’oggetto puntato dal puntatore.
Oltre all’ asterisco, vi è un altro operatore: la e commerciale &. Vediamo più nel dettaglio come usarla:
In questo modo abbiamo assegnato a puntatore l’indirizzo della variabile.
Anche per i puntatori esiste un’aritmetica base, con la quale puoi aggiungere o togliere dei valori, solitamente rappresentati come blocchi di memoria.
Se si crea un puntatore ad int, il blocco di memoria vale 4 byte; un puntatore a char, invece, usa blocchi di 1 byte. In questo modo se si utilizza l’operatore ++, si incrementa il blocco in base al tipo di variabile puntata.
PUNTATORI ED ARRAY
Puntatori ed array sono accomunati da un aspetto fondamentale: sono entrambi memorizzati in locazioni sequenziali di memoria. Per cui se consideriamo l’array come una serie di blocchi di indirizzi, possiamo agire su un array come se stessimo agendo su un puntatore e viceversa.
Vediamo più nel dettaglio, con un esempio, questa somiglianza tra questi colossi della programmazione C:
Questo significa che possiamo accedere a qualsiasi elemento dell’array inserendo il numero della posizione in cui si trova l’elemento stesso, oppure sommando al valore del puntatore il primo elemento:
Questo perché quando viene instanziato un array non viene fatto altro che creare un puntatore ad una certa area della memoria centrale, per poi riservare tanto spazio in memoria quanto specificato dalla dimensione dell’array.
PUNTATORI E STRUTTURE
Anche il legame tra puntatori e strutture è di fondamentale importanza. Ricordiamo che la struttura è un contenitore di elementi di tipi non omogenei (tipi diversi: int, float, char, ecc).
Quindi partiamo subito dall’esempio:
Abbiamo creato una struttura di tipo PIPPO e di nome ELEMENTO, vi è anche un puntatore collegato alla struttura. Notiamo l’uso dell’operatore -> sul puntatore alla struttura, per accedere ai membri interni della struttura ELEMENTO.
Nel prossimo articolo parleremo di Gestione della memoria, se invece ti sei perso lo scorso articolo, si è parlato dei Dati strutturati.
Stai cercando altre guide? Allora dai uno sguardo alla nostra raccolta dedicata alla Programmazione C.
Alla prossima!