7 votes

Adresse en C : &(numéro)

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 ?

13voto

minitech Points 87225
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à.

Voici un exemple réduit.


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)

5voto

houbysoft Points 9773

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.com

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.

Powered by:

X