Puntero Aritmética en C

Considere el siguiente fragmento de código:

int (*p)[3]; int (*q)[3]; q = p; q++; printf("%d, %d\n", q, p); printf("%d\n", qp); 

Sé que la aritmética del puntero es inteligente, lo que significa que la operación q++ avanza q suficientes bytes para señalar a la siguiente matriz de 3 enteros, por lo que no me sorprende que la primera letra sea 12, 0 ‘, lo que significa que se incrementa q lo hizo más grande en 12.

Pero la segunda impresión me sorprende. ¡Imprime 1!
Entonces, ¿por qué imprimiría 1 en lugar de 12? solo me desconcierta.

Al igual que el operador de incremento ++ , el operador de resta con punteros también tiene en cuenta el tamaño de los objetos apuntados. Específicamente, el resultado devuelto es el número de bytes de diferencia en los valores del puntero dividido por el tamaño del objeto apuntado (12, en su ejemplo). Entonces la diferencia es 12 bytes, dividido por tamaño 12 o 1.

Si realmente quieres saber la diferencia, lanza cada puntero a a (char *) y luego a (int) y luego reste. Eso debería darte la respuesta.

Este código te da el valor absoluto:

 printf("%d\n", abs((int)((char*)q) - (int)((char*)p))); 

Recuerde incluir math.h.

Editar: Como se señala en un comentario, no necesitamos un doble molde. Al convertir cada pointerpointer en un int y luego en restar se obtiene la misma respuesta que el double casting (innecesario) anterior.

 printf("%d\n", abs((int)(q) - (int)(p)));