Je ne comprends pas le résultat de ce programme :
int arr[]={1,7,4,2,5,8};
int x=(&(arr[arr[1]-arr[4]])-arr);
printf("%d" ,x);
arr[arr[1]-arr[4]]
est égal à 4. Qu'est-ce que cela signifie &(4)
? Pourquoi est-ce qu'il imprime 2 ?
Je ne comprends pas le résultat de ce programme :
int arr[]={1,7,4,2,5,8};
int x=(&(arr[arr[1]-arr[4]])-arr);
printf("%d" ,x);
arr[arr[1]-arr[4]]
est égal à 4. Qu'est-ce que cela signifie &(4)
? Pourquoi est-ce qu'il imprime 2 ?
arr[1] - arr[4]
C'est exactement comme ça. 7 - 5 = 2
remplaçons-le donc par 2
:
arr[2]
C'est aussi ce qu'il semble. 4
. Le site &
prend son adresse, qui sera de deux int
à partir du début du tableau, ce qui correspond à arr
.
&(arr[2]) - arr
Cela soustrait arr
donc vous vous retrouvez avec le décalage de arr[2]
de arr
qui est de deux int
s. Et voilà.
Au cas où vous vous attendiez à ce que ce soit 8
et bien, c'est comme ça qu'est l'arithmétique des pointeurs. En les transformant tous les deux en unsigned int
:
(unsigned int)&arr[2] - (unsigned int)arr
donnera 8
du moins lorsqu'une int
est de quatre octets. (Démo)
Regardez la réponse de minitech qui montre comment la valeur d'impression de "2" peut être déduite.
Cependant, je pense que dans votre cas, vous avez juste mal compris comment la &
L'opérateur travaille. Oui, arr[arr[1]-arr[4]]
est 4
mais cela ne signifie pas que &(arr[arr[1]-arr[4]])
fait &4
; il fait &(arr[2])
; et il prend l'adresse de arr[2]
et non la valeur de arr[2]
qui est 4
.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.