Operatori address-of e di riferimento indiretto
L'operatore di riferimento indiretto (*) accede indirettamente a un valore tramite un puntatore. L'operando deve essere un valore del puntatore. Il risultato dell'operazione è il valore indicato dall'operando, ovvero il valore al cui indirizzo punta l'operando. Il tipo del risultato corrisponde al tipo indirizzato dall'operando.
Se l'operando punta a una funzione, il risultato è un indicatore di funzione. Se invece punta a un percorso di archiviazione, il risultato è un valore l-value che definisce il percorso di archiviazione.
Se il valore del puntatore non è valido, il risultato sarà indefinito. Nell'elenco seguente sono incluse alcune delle situazioni più comuni che invalidano un valore del puntatore.
Il puntatore è un puntatore null.
Il puntatore specifica l'indirizzo di un elemento locale non visibile al momento del riferimento.
Il puntatore specifica un indirizzo allineato in modo non appropriato per il tipo di oggetto cui fa riferimento.
Il puntatore specifica un indirizzo non utilizzato dal programma di esecuzione.
L'operatore address-of (&) restituisce l'indirizzo del proprio operando. L'operando dell'operatore address-of può essere un indicatore di funzione o un valore l-value che definisce un oggetto che non è un campo di bit e non è dichiarato con l'identificatore della classe di archiviazione register.
Il risultato dell'operazione di indirizzamento è un puntatore all'operando. Il tipo indirizzato dal puntatore è il tipo dell'operando.
L'operatore address-of può essere applicato solo a variabili di tipo fondamentale, struttura o unione dichiarate a livello di file oppure a riferimenti a matrice con indice. In queste espressioni, un'espressione costante che non include l'operatore address-of può essere aggiunta o sottratta dall'espressione di indirizzo.
Esempi
Negli esempi seguenti vengono utilizzate queste dichiarazioni:
int *pa, x;
int a[20];
double d;
Questa istruzione utilizza l'operatore address-of:
pa = &a[5];
L'operatore address-of (&) accetta l'indirizzo del sesto elemento della matrice a. Il risultato viene archiviato nella variabile del puntatore pa.
x = *pa;
L'operatore di riferimento indiretto (*) viene utilizzato in questo esempio per accedere al valore int all'indirizzo archiviato in pa. Il valore viene assegnato alla variabile Integer x.
if( x == *&x )
printf( "True\n" );
L'esempio stampa la parola True, dimostrando che il risultato dell'applicazione dell'operatore di riferimento indiretto all'indirizzo di x è lo stesso x.
int roundup( void ); /* Function declaration */
int *proundup = roundup;
int *pround = &roundup;
Dopo che la funzione roundup è stata dichiarata, vengono dichiarati e inizializzati due puntatori a roundup. Il primo puntatore, proundup, viene inizializzata utilizzando solo il nome della funzione, mentre il secondo, pround, utilizza l'operatore address-of nell'inizializzazione. Le inizializzazioni sono equivalenti.