Tipo puntatore | ||
Tra i tipi non primitivi distinguiamo un particolare tipo di dato che riveste nella programmazione un'importanza particolare. Stiamo parlando del tipo puntatore. I puntatori rappresentano uno dei punti di forza più rappresentativi del linguaggio C. Al tempo stesso, però, spesso sono causa di confusione per i neofiti a causa del loro meccanismo leggermente complesso. Per semplificare le cose diciamo che una variabile puntatore è una variabile che contiene l'indirizzo di memoria di un'altra variabile. Cerchiamo di capire con calma cosa significa tutto questo. Per poter utilizzare un dato è necessario che questo sia nella memoria del computer. Durante l'esecuzione del programma il microprocessore del computer fa riferimento a questo dato attraverso un numero che ne indica la posizione in memoria sin dall'inizio del programma (noi, invece, solitamente lo indichiamo attraverso il nome che gli abbiamo assegnato con le dichiarazioni). E' evidente che ad ogni dato è associato automaticamente (non lo facciamo noi) un numero che ne rappresenta la posizione in memoria. I puntatori, in sostanza, ci permettono di indicare il dato utilizzando direttamente la posizione in memoria (che comunque non siamo tenuti a sapere) e sono quindi un dato numerico, anche se di tipo particolare visto che in realtà contengono un indirizzo. A questo punto è opportuno precisare che in C e C++ si indica l'indirizzo di un dato anteponendo il simbolo & al nome di una variabile. Quindi se abbiamo dichiarato una variabile raggio con l'istruzione int raggio;scrivere a=raggio;vuol dire assegnare ad a il valore della variabile raggio. In questo caso anche a deve essere stata dichiarata come una variabile intera. Mentre, scrivere: a=&raggio;vuol dire assegnare ad a l'indirizzo di memoria della variabile raggio. In questo caso a deve essere stata dichiarata come variabile di tipo puntatore e, in particolare, come puntatore a numero intero. Nel secondo esempio la dichiarazione di a potrebbe essere: int* a; Si deduce che un puntatore ad un particolare tipo di dati si dichiara con la stessa sintassi del tipo di dati a cui è destinato ma con l'aggiunta dell'asterisco (*) dopo la parola indicante il tipo. Quindi, facendo alcuni esempi: int* px; // definisce px come puntatore a interi float* pf // definisce pf come puntatore a reali singola precisione char* punt // definisce la variabile punt come puntatore a caratteri La coppia di istruzioni float numero_reale; float* puntatore_a_reale = &numero_reale; Definiscono, la prima, una variabile di tipo reale a precisione singola con nome numero_reale e, la seconda, una variabile di tipo puntatore che contiene l'indirizzo della variabile numero_reale e che si chaima puntatore_a_reale. Il C++ mette a disposizione un tipo particolare di inizializzazione di un puntatore. È possibile, ed anzi è buona norma farlo, inizializzare una variabile puntatore a NULL (ovvero non la si fa puntare a nessun indirizzo di memoria) . Ad esempio: int* p_x = NULL; char* p_c = NULL;Quando però si inizializza un puntatore a NULL, si deve tener presente che non è possibile in alcun modo utilizzare la variabile puntatore per nessuna operazione finché non la si inizializzi con un indirizzo valido. Ci sarebbe ancora qualcosina da aggiungere sui puntatori ma per ora basterà quanto scritto fin qui. Non è proprio semplicissimo ma neanche tanto complicato. In seguito, usandoli un po', il significato di tutto questo sarà più chiaro (almeno lo spero!). | ||
| ||
Ultima modifica: 27/04/2010 |