El estándar C++ define qué es una matriz y su comportamiento. Eche un vistazo en el índice. No es un puntero, const o no, y no es nada más, es una matriz.
Para ver una diferencia:
int a[10];
int *const b = a;
std::cout << sizeof(a); // prints "40" on my machine.
std::cout << sizeof(b); // prints "4" on my machine.
Es evidente que A y B no son del mismo tipo, ya que tienen diferentes tamaños.
En la mayoría de los contextos, un nombre de matriz "decae" en un puntero a su primer elemento. Puedes pensar en esto como una conversión automática. El resultado es un valor r, lo que significa que es "solo" un valor de puntero y no se puede asignar a, de forma similar a cuando un nombre de función decae en un puntero de función. No significa que sea "const" como tal, pero no es asignable.
Entonces una matriz "es" un puntero muy parecido a una función "es" un puntero a la función, o un largo "es" un int. Es decir, no es realmente así, pero puede usarlo como uno solo en la mayoría de los contextos gracias a la conversión.
realmente insight! Gracias ! – lovespring
* a estaría imprimiendo el valor del primer elemento en la matriz y, por lo tanto, se suponía que apuntaba a la dirección de memoria del primer elemento de la matriz. Entonces, ¿por qué el operador sizeof da el tamaño de todos los elementos de la matriz a en lugar de dar el tamaño de solo almacenar la dirección de memoria del primer elemento de la matriz? – user1825567
@ user1825567: porque la expresión '* a' tiene una conversión implícita (llamada" decaimiento "), del tipo de matriz al tipo de puntero. Podría pensarlo como una abreviatura de '* pointer_to_first_element_of (a)'. Entonces debería ser bastante obvio por qué 'sizeof (a)' no necesita ser igual que 'sizeof (pointer_to_first_element_of (a))'. 'a' no es un puntero. Cualquiera que le diga que no entiende C o no lo respeta lo suficiente como para pensar que usted entiende C. –