Diferencia de tipo similar de punteros.

La diferencia de dos punteros del mismo tipo es siempre uno.

#include #include int main(){ int a = 5,b = 10,c; int *p = &a,*q = &b; c = p - q; printf("%d" , c); return 0; } Output is 1. 

No entiendo el razonamiento detrás de esto

El comportamiento es indefinido.

C99 6.5.6 El párrafo 9 dice:

Cuando se restan dos punteros, ambos apuntarán a elementos del mismo objeto de matriz, o uno más allá del último elemento del objeto de matriz; el resultado es la diferencia de los subíndices de los dos elementos de la matriz.

El párrafo 7 en la misma sección dice:

Para los propósitos de estos operadores, un puntero a un objeto que no es un elemento de una matriz se comporta igual que un puntero al primer elemento de una matriz de longitud uno con el tipo del objeto como su tipo de elemento.

Sección 4 párrafo 2 dice:

Si se viola un requisito de “debe” o “no debe” que aparece fuera de una restricción, el comportamiento no está definido. El comportamiento indefinido se indica de otro modo en esta Norma Internacional por las palabras “comportamiento indefinido” o por la omisión de cualquier definición explícita de comportamiento. No hay diferencia en el énfasis entre estos tres; todos ellos describen “comportamiento que es indefinido”.

3.4.3 define el término “comportamiento indefinido” como:

comportamiento, en el uso de un constructo de progtwig no portátil o erróneo o de datos erróneos, para los cuales esta Internacional no impone requisitos

NOTA El posible comportamiento no definido varía desde ignorar la situación completamente con resultados impredecibles, a comportarse durante la traducción o la ejecución del progtwig de una manera documentada característica del entorno (con o sin la emisión de un mensaje de diagnóstico), hasta terminar una traducción o ejecución (con la emisión de un mensaje de diagnóstico).

Dada la statement:

 int a = 5, b = 10, c; 

es probable que evaluar &b - &a produzca un resultado que parezca razonable, como 1 o -1 . (Los resultados razonables son siempre un posible síntoma de un comportamiento indefinido; no está definido, no es necesario que se bloquee). Pero el comstackdor no tiene la obligación de colocar a y b en ninguna ubicación en particular en la memoria, y aún si lo hace. No se garantiza que la resta sea significativa. Un comstackdor optimizador es libre de transformar su progtwig en formas que asumn que su comportamiento está bien definido, lo que resulta en un código que puede comportarse de manera arbitrariamente mala si se viola esa suposición.

Al escribir &b - &a , en efecto, está prometiendo al comstackdor que es una operación significativa. Como Henry Spencer dijo famoso: “Si le mientes al comstackdor, conseguirá venganza”.

Tenga en cuenta que no solo el resultado de la resta no está definido, es el comportamiento del progtwig que lo evalúa.


Oh, ¿mencioné que el comportamiento no está definido?

De hecho, el comportamiento de su progtwig no está definido. La salida pasa a ser 1 en su plataforma / comstackdor, pero podría ser otra cosa con la misma facilidad.

Este código muestra un comportamiento indefinido porque la aritmética de punteros solo se define cuando los operandos están en la misma matriz o estructura.

El valor de 1 se produce porque el comstackdor ha colocado a y b uno al lado del otro en la memoria. Otro comstackdor podría hacer algo diferente. De hecho, el mismo comstackdor podría hacer algo diferente la próxima vez que cambies el código.

C comstackdor sabe el tamaño de cada tipo. por ejemplo, supongamos que P es un puntero int que se refiere a la address 0x0010 . si agrega P por 1 (P ++ o P = P + 1), entonces el valor de P es 0x0014 .

Acerca de su pregunta, las variables b declararon tándems, en physical memory tándems, y el jefe de cada uno de ellos, tiene 4 bytes difference con el otro. En esta situación, el comstackdor sabe que el tamaño int es de 4 bytes. cuando restas 2 int puntero, el comstackdor divide the result by 4 .