No entiendo la salida de este programa:Dirección en C: Y (número)
int arr[]={1,7,4,2,5,8};
int x=(&(arr[arr[1]-arr[4]])-arr);
printf("%d" ,x);
arr[arr[1]-arr[4]]
es igual a 4. ¿Qué significa &(4)
? ¿Por qué imprime 2?
No entiendo la salida de este programa:Dirección en C: Y (número)
int arr[]={1,7,4,2,5,8};
int x=(&(arr[arr[1]-arr[4]])-arr);
printf("%d" ,x);
arr[arr[1]-arr[4]]
es igual a 4. ¿Qué significa &(4)
? ¿Por qué imprime 2?
arr[1] - arr[4]
Esto es lo que parece. 7 - 5 = 2
, así que vamos a sustituir eso con 2
:
arr[2]
Eso también es igual de lo que parece. 4
. El &
toma su dirección, que será dos int
s desplazamiento desde el comienzo de la matriz, que es arr
.
&(arr[2]) - arr
que resta arr
, por lo que se queda con el desplazamiento de arr[2]
de arr
, que es de dos int
s. Ahí tienes.
En caso de que se esperaba que fuera 8
, bueno, eso es sólo la forma en la aritmética de punteros es. De reparto a los dos a unsigned int
:
(unsigned int)&arr[2] - (unsigned int)arr
rendirá 8
, al menos cuando un int
es de cuatro bytes. (Demo)
Mire la respuesta de minitech para mostrar cómo se puede deducir el valor de impresión de "2".
Sin embargo, creo que en su caso simplemente no entendió cómo funciona el operador &
. Sí, arr[arr[1]-arr[4]]
es 4
, pero eso no significa que &(arr[arr[1]-arr[4]])
está haciendo &4
; está haciendo &(arr[2])
; y está tomando la dirección de arr[2]
, no el valor de arr[2]
, que es 4
.