Confusión de resta de puntero
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?
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 *p
serán 14. Ir p=p-3
sería *p
17.
Entonces, si tiene int* p = &(array[5])
y int *q = &(array[3])
, entonces p-q
deberí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!
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