Red de conocimientos sobre prescripción popular - Cuidado de la salud en otoño - La diferencia entre las direcciones A y a+1 en la matriz int a[n] es 4, pero ¿por qué a+1-a no es 4 sino 1?

La diferencia entre las direcciones A y a+1 en la matriz int a[n] es 4, pero ¿por qué a+1-a no es 4 sino 1?

int? a[n]; La línea de código anterior declara una matriz de números enteros llamada a. De hecho, aquí a es una dirección, que es la dirección del 0º (primer) elemento de la matriz.

int? ¿b? =?a[2];? // ¿Usarlo aquí? 2? Por ejemplo, para evitar 0? Entonces qué. La particularidad de 1? es fácil de entender. El proceso de esta línea "hacer que B sea igual a a[d]" es en realidad realizar una operación llamada "[]" en las direcciones A y 2 y devolver el contenido de la nueva dirección. El proceso es el siguiente:

El contenido al que apunta la dirección A es un número entero (como se puede ver en la declaración), por lo que sizeof(int) obtiene 4, lo que significa que un valor int ocupa 4 bytes .

La operación "[]" en realidad agrega la dirección a y 4×subíndice. Lo que se obtiene aquí es la ubicación de la dirección de "a+8 (byte)".

Devuelve el contenido de "a+8 (bytes)" y asígnalo a la variable b.

El "a+8 (byte)" anterior es una operación de dirección, pero no se puede escribir así en una expresión. En las expresiones, las operaciones con direcciones y números enteros convierten el número entero y el tipo al que apunta la dirección en la misma unidad. Por ejemplo:

int? uno[]? =?{1,?2,?3};

int*? dirección1? =?& amp(a[0]);

int*? ¿Dirección 2? =?& amp(a[1]);

int? ¿respuesta? =?Dirección 2? -?dirección 1;? //ans? =?4?/?tamañode(int);? ¿respuesta? ¿igual? 1

int? ans2? =?int(dirección2?-?dirección 1);? //Conversión explícita a número entero. Tanto ans como ans2 están en "tamaño de (tipo) bytes". Aquí son 4 bytes, el resultado es exactamente el mismo, excepto que ans está escrito con conversión de tipo implícita. La diferencia obtenida por la diferencia de direcciones se divide por el tamaño de este tipo y se convierte en un número entero.

También puedes probar el tipo bool. El tipo Bool ocupa un byte.

¿Booleano? b[]? =?{0,?1,?1};

¿Booleano? *?Dirección 3? =?& amp(b[0]);

¿Booleano? *?Dirección 4? =?& amp(b[1]);

int? ans3? =?Dirección 4? -?¿DIRECCIÓN? 3;ans3 sigue siendo 1. Como bool ocupa un byte, la dirección se divide por 1 para obtener 1.

La expresión "(dirección 3+1) == dirección 4" es verdadera. Porque 1 se convierte en 1 * sizeof(bool) o 1.

Por lo tanto, en aplicaciones prácticas, la distancia entre dos direcciones conocidas del mismo tipo se puede obtener mediante suma y resta. La unidad de distancia aquí es el número de bytes ocupados por este tipo.