2012-07-01 10 views
7

Non capisco l'uscita di questo programma:Indirizzo in C: & (numero)

int arr[]={1,7,4,2,5,8}; 
int x=(&(arr[arr[1]-arr[4]])-arr); 
printf("%d" ,x); 

arr[arr[1]-arr[4]] è pari a 4. Che cosa significa &(4)? Perché stampa 2?

risposta

13
arr[1] - arr[4] 

Questo è proprio come sembra. 7 - 5 = 2, quindi cerchiamo di sostituirlo con 2:

arr[2] 

Questo è anche proprio come sembra. 4. Il & prende il suo indirizzo, che sarà due offset int s dall'inizio della matrice, che è arr.

&(arr[2]) - arr 

che sottrae arr, quindi si è lasciato con l'offset di arr[2] da arr, che è due int s. Ecco qua.

Here's a reduced example.


Nel caso in cui si aspettavano che fosse 8, beh, questo è proprio come l'aritmetica dei puntatori è. entrambi colata a unsigned int:

(unsigned int)&arr[2] - (unsigned int)arr 

produrrà 8, almeno quando un int è quattro byte. (Demo)

5

Guarda la risposta di minitech per mostrare come si può dedurre il valore di stampa di "2".

Tuttavia, penso che nel tuo caso hai appena frainteso come funziona l'operatore &. Sì, arr[arr[1]-arr[4]] è 4, ma ciò non significa che &(arr[arr[1]-arr[4]]) stia facendo &4; sta facendo &(arr[2]); e sta prendendo l'indirizzo di arr[2], non il valore di arr[2], che è 4.