Download - Puntatori C++

Transcript
Page 1: Puntatori C++

PUNTATORI

Page 2: Puntatori C++

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

Page 3: Puntatori C++

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

Page 4: Puntatori C++

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

Page 5: Puntatori C++

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

Page 6: Puntatori C++

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.

Page 7: Puntatori C++

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