¿Por qué “a + 1” y “& a + 1” dan resultados diferentes cuando “a” es una matriz int?

int main() { int a[]={1,2,3,4,5,6,7,8,9,0}; printf("a = %u , &a = %u\n",a,&a); printf("a+1 = %u , &a+1 = %u\n",a+1,&a+1); } 

¿Cómo a y & a son interpretados internamente?

Bueno, a es la dirección del primer elemento de la matriz, y & a es la dirección de la matriz, pero obviamente ambos tienen la misma dirección.

Sin embargo, cuando agrega (o resta) un número desde un puntero, el comstackdor toma en consideración el tamaño de los datos, por lo que en su caso (suponiendo que el tamaño de int es de 4 bytes) a + 1 será mayor que a por 4 porque se mueve el puntero uno entero por delante, pero & a + 1 sería más grande por 40 porque usted es más el puntero ARRAY OF 10 INTEGERS por delante.

Ambas declaraciones imprimen direcciones y probablemente están destinadas a explicar la aritmética de punteros.

a y &a no son iguales, tienen diferentes tipos, pero tienen la misma dirección de memoria.

&a es de tipo int (*)[10] (que actúa como un puntero a una matriz)
a es de tipo int [10] (que actúa como un puntero a un solo elemento)

Así que cuando agregues 1 ten en cuenta esos tipos. El puntero se compensará con el tamaño del tipo que contiene la dirección. a+1 compensa con el tamaño de int, es decir, con el segundo elemento de la matriz. &a+1 compensa completamente el conjunto completo.