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?
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?
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.
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)
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
.