Operatori address-of e di riferimento indirettoIndirection and Address-of Operators

L'operatore di riferimento indiretto unario (*) accede indirettamente a un valore tramite un puntatore.The unary indirection operator (*) accesses a value indirectly, through a pointer. L'operando deve essere un tipo di puntatore.The operand must be a pointer type. Il risultato dell'operazione è il valore indicato dall'operando, ovvero il valore al cui indirizzo punta l'operando.The result of the operation is the value addressed by the operand; that is, the value at the address to which its operand points. Il tipo del risultato corrisponde al tipo indirizzato dall'operando.The type of the result is the type that the operand addresses.

Il risultato dell'operatore di riferimento indiretto è type se l'operando è di tipo pointer to type.The result of the indirection operator is type if the operand is of type pointer to type. Se l'operando punta a una funzione, il risultato è un indicatore di funzione.If the operand points to a function, the result is a function designator. Se invece punta a un oggetto, il risultato è un lvalue che definisce l'oggetto.If it points to an object, the result is an lvalue that designates the object.

Se il valore del puntatore non è valido, il risultato dell'operatore di riferimento indiretto è indefinito.If the pointer value is not valid, the result of the indirection operator is undefined. Di seguito sono elencate alcune delle condizioni più comuni che invalidano un valore di puntatore:These are some of the most common conditions that invalidate a pointer value:

  • Il puntatore è un puntatore null.The pointer is a null pointer.

  • Il puntatore specifica l'indirizzo di un oggetto la cui durata è terminata, ad esempio un oggetto fuori ambito o deallocato, al momento del riferimento.The pointer specifies the address of an object after the end of its lifetime (such as an object that's gone out of scope or that's been deallocated) at the time of the reference.

  • Il puntatore specifica un indirizzo allineato in modo non appropriato per il tipo di oggetto cui fa riferimento.The pointer specifies an address that is inappropriately aligned for the type of the object pointed to.

  • Il puntatore specifica un indirizzo non utilizzato dal programma di esecuzione.The pointer specifies an address not used by the executing program.

L'operatore address-of unario (&) specifica l'indirizzo del relativo operando.The unary address-of operator (&) gives the address of its operand. L'operando deve essere un lvalue che specifica un oggetto non dichiarato register e non è un campo di bit oppure il risultato di un operatore * unario, di un operatore ([]) senza riferimenti di matrice o di un indicatore di funzione.The operand must be either an lvalue that designates an object that is not declared register and is not a bit-field, or the result of a unary * operator or an array dereference ([]) operator, or a function designator. Il risultato è di tipo pointer to type per un operando di tipo type.The result is of type pointer to type for an operand of type type.

Se l'operando è il risultato di un operatore * unario, non viene valutato alcun operatore e ne deriva un risultato che corrisponde all'omissione di entrambi.If the operand is the result of a unary * operator, neither operator is evaluated and the result is as if both were omitted. Il risultato non è un lvalue e i vincoli sugli operatori vengono mantenuti.The result is not an lvalue, and the constraints on the operators still apply. Se l'operando è il risultato di un operatore [], non viene valutato né l'operatore & né l'operatore * unario implicato dall'operatore [].If the operand is the result of a [] operator, neither the & operator nor the unary * implied by the [] operator is evaluated. Il risultato corrisponde alla rimozione dell'operatore & e alla modifica dell'operatore [] in un operatore +.The result has the same effect as removing the & operator and changing the [] operator to a + operator. In caso contrario, il risultato è un puntatore all'oggetto o alla funzione definita dall'operando.Otherwise, the result is a pointer to the object or function designated by the operand.

EsempiExamples

Gli esempi seguenti usano le dichiarazioni comuni che seguono:The following examples use these common declarations:

int *pa, x;
int a[20];
double d;

Questa istruzione usa l'operatore address-of (&) per accettare l'indirizzo del sesto elemento della matrice a.This statement uses the address-of operator (&) to take the address of the sixth element of the array a. Il risultato viene archiviato nella variabile del puntatore pa:The result is stored in the pointer variable pa:

pa = &a[5];

L'operatore di riferimento indiretto (*) viene usato in questo esempio per accedere al valore int all'indirizzo archiviato in pa.The indirection operator (*) is used in this example to access the int value at the address stored in pa. Il valore viene assegnato alla variabile Integer x:The value is assigned to the integer variable x:

x = *pa;

L'esempio dimostra che il risultato dell'applicazione dell'operatore di riferimento indiretto all'indirizzo di x è lo stesso di x:This example demonstrates that the result of applying the indirection operator to the address of x is the same as x:

assert( x == *&x );

Questo esempio illustra modi equivalenti di dichiarare un puntatore a una funzione:This example shows equivalent ways of declaring a pointer to a function:

int roundup( void );     /* Function declaration */

int  *proundup  = roundup;
int  *pround  = &roundup;
assert( pround == proundup );

Dopo che la funzione roundup è stata dichiarata, vengono dichiarati e inizializzati due puntatori a roundup.Once the function roundup is declared, two pointers to roundup are declared and initialized. Il primo puntatore, proundup, viene inizializzata utilizzando solo il nome della funzione, mentre il secondo, pround, utilizza l'operatore address-of nell'inizializzazione.The first pointer, proundup, is initialized using only the name of the function, while the second, pround, uses the address-of operator in the initialization. Le inizializzazioni sono equivalenti.The initializations are equivalent.

Vedere ancheSee also

Operatore di riferimento indiretto: *Indirection Operator: *
Operatore address-of: &Address-of Operator: &