Confusión de resta de puntero

Resuelto asked hace 14 años • 8 respuestas

Cuando restamos un puntero de otro puntero, la diferencia no es igual a cuántos bytes están separados, sino a cuántos números enteros (si apuntan a números enteros) están separados. ¿Porque?

 avatar Jul 13 '10 22:07
Aceptado

La idea es que estés apuntando a bloques de memoria.

+----+----+----+----+----+----+
| 06 | 07 | 08 | 09 | 10 | 11 | mem
+----+----+----+----+----+----+
| 18 | 24 | 17 | 53 | -7 | 14 | data
+----+----+----+----+----+----+

Si es int* p = &(array[5])así, entonces *pserán 14. Ir p=p-3sería *p17.

Entonces, si tiene int* p = &(array[5])y int *q = &(array[3]), entonces p-qdebería ser 2, porque los punteros apuntan a la memoria que está a 2 bloques de distancia.

Cuando trabaje con memoria sin procesar (matrices, listas, mapas, etc.), dibuje muchos cuadros. ¡Realmente ayuda!

corsiKa avatar Jul 13 '2010 15:07 corsiKa

Porque todo en Pointer-land tiene que ver con compensaciones . Cuando tu dices:

int array[10];
array[7] = 42;

Lo que realmente estás diciendo en la segunda línea es:

*( &array[0] + 7 ) = 42;

Traducido literalmente como:

* = "what's at"
(
  & = "the address of"
  array[0] = "the first slot in array"
  plus 7
)
set that thing to 42

Y si podemos sumar 7 para hacer que el punto de desplazamiento esté en el lugar correcto, necesitamos poder tener lo opuesto en su lugar; de lo contrario, no tenemos simetría en nuestras matemáticas. Si:

&array[0] + 7 == &array[7]

Luego, por cordura y simetría:

&array[7] - &array[0] == 7
eruciform avatar Jul 13 '2010 15:07 eruciform