2. Che cosa sono?
Un puntatore è una variabile che contiene l'indirizzo di memoria di un altra
variabile, si dichiara specificando il tipo della variabile puntata, ad
esempio:
int *p;
Posso dichiarare anche un puntatore a puntatore:
int ** p
3. Operatori:
Gli operatori che useremo con i puntatori sono due:
L’operatore «&», che ci fornisce l’indirizzo della variabile
L’operatore «*», che ci da il contenuto dell’oggetto a cui punta il puntatore
Es:
p= &a; assegna a p l’indirizzo di a
b=*p; assegna a b il contenuto di p, che in questo caso sarebbe l’indirizzo di a
*p=2; assegna al contenuto di pointer il valore 2
4. Assegnazione di un valore
Gli indirizzi di memoria non possono essere assegnati da istruzioni di
programma, ma vengono determinati in fase di esecuzion, quindi possiamo
assegnare valori ai puntatori solo in questi casi:
Se devo assegnargli il valore NULL, cioè non punta a niente: int * p=
NULL;
Se devo assegnargli l’indirizzo di una variabile esistente:
int a;
int* p;
p = &a;
Altri tipi di assegnamento vengono considerati errori
5. Puntatori a void
Questo tipo di puntatori possono puntare a qualsiasi tipo di variabile:
void * p;
A un puntatore a void si può assegnare il valore di qualunque puntatore, ma non si
può fare viceversa:
int* a;
void* p;
p = a; //posso assegnare a p, il valore a
a= (int*)p; // cosi assegno ad a l’indirizzo a cui punta p
6. Funzioni con puntatori
Quando passo un argomento di indirizzo in una chiamata a funzione:
funzione( &a )
nella dichiarazione di funzione e nella definizione devo dichiarare il
corrispondente come puntatore, specificando il tipo
void funzione(int* p)
L’argomento viene passato per valore.
7. Aritmetica dei puntatori
Le operazioni sui puntatori dipendono dal tipo a cui si fa riferimento, ad
esempio per incrementare o decrementare un puntatore dichiaro un
puntatore double: double *p;
Se faccio questa operazione: p+1;
Non incremento il mio valore di 1 ma punto all’indirizzo di p+8, 8 è la
dimensione del tipo double.
Se scrivo p+k corrisponde all’inidirizzo di p+k*8
Invece se scrivo: *(p+1) corrisponde all’oggetto puntato da p+1