Diferencia de puntero / dirección

¿Por qué la diferencia entre las dos direcciones es incorrecta? http://codepad.org/NGDqFWjJ

#include int main() { int i = 10, j = 20; int *p = &i; int *q = &j; int c = p - q; printf("%d\n", p); printf("%d\n", q); printf("%d", c); return 0; } 

Salida:

 -1083846364 -1083846368 1 

Primero, la aritmética del puntero no se define cuando se realiza en punteros no relacionados.

En segundo lugar, tiene sentido. Al restar punteros se obtiene el número de elementos entre esas direcciones, no el número de bytes.

Si fueras a probar eso con

 char *p1 = &i, *p2 = &j; 

obtendrías un resultado diferente


Como nota al margen, use %p cuando imprima punteros.

Como han dicho otros, el resultado que obtienes está en un múltiplo del tamaño del tipo al que apuntan los apuntadores. Equípelos para que sean punteros de caracteres y el resultado que obtienes será en términos de bytes. Además, debe usar el tipo ptrdiff_t , de modo que en sistemas con punteros de 64 bits, el tipo sea lo suficientemente grande como para contener el resultado.

 ptrdiff_t c = (char*)p - (char*)q; 

También tenga en cuenta que tomar la diferencia de las direcciones de dos valores que no están en el mismo conjunto no está definido en el estándar, pero funciona en todos los sistemas.

Estrictamente hablando, su progtwig causa algunos tipos de comportamiento indefinido, primero debido a la aritmética del puntero en punteros no relacionados, y luego al no emparejar cadenas de formato y argumentos en sus instrucciones de impresión. Sin embargo, incluso si se corrigieran, vería los mismos resultados. La razón por la que la diferencia es 1 es porque la aritmética del puntero da resultados en unidades del tamaño del tipo apuntado – en su caso int es un tipo de 4 bytes, por lo que al restar los punteros int * que separan 4 bytes se obtiene un resultado de 1.