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

L'operatore di riferimento indiretto (\) accede indirettamente a un valore tramite un puntatore.The indirection operator (****) accesses a value indirectly, through a pointer. L'operando deve essere un valore del puntatore.The operand must be a pointer value. 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.

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 percorso di archiviazione, il risultato è un valore l-value che definisce il percorso di archiviazione.If it points to a storage location, the result is an l-value designating the storage location.

Se il valore del puntatore non è valido, il risultato sarà indefinito.If the pointer value is invalid, the result is undefined. Nell'elenco seguente sono incluse alcune delle situazioni più comuni che invalidano un valore del puntatore.The following list includes 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 elemento locale non visibile al momento del riferimento.The pointer specifies the address of a local item that is not visible 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 (&) restituisce l'indirizzo del proprio operando.The address-of operator (&) gives the address of its operand. 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.The operand of the address-of operator can be either a function designator or an l-value that designates an object that is not a bit field and is not declared with the register storage-class specifier.

    Il risultato dell'operazione di indirizzamento è un puntatore all'operando.The result of the address operation is a pointer to the operand. Il tipo indirizzato dal puntatore è il tipo dell'operando.The type addressed by the pointer is the type of the operand.

    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.The address-of operator can only be applied to variables with fundamental, structure, or union types that are declared at the file-scope level, or to subscripted array references. In queste espressioni, un'espressione costante che non include l'operatore address-of può essere aggiunta o sottratta dall'espressione di indirizzo.In these expressions, a constant expression that does not include the address-of operator can be added to or subtracted from the address expression.

EsempiExamples

Negli esempi seguenti vengono utilizzate queste dichiarazioni:The following examples use these declarations:

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

Questa istruzione utilizza l'operatore address-of:This statement uses the address-of operator:

pa = &a[5];  

L'operatore address-of (&) accetta l'indirizzo del sesto elemento della matrice a.The address-of operator (&) takes 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.

x = *pa;  

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.

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.This example prints the word True, demonstrating that the result of applying the indirection operator to the address of x is the same as 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.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: &