Ответ 1
Стандарт С++ определяет, что такое массив и его поведение. Взгляните в индекс. Это не указатель, const или иначе, и это не что иное, это массив.
Чтобы увидеть разницу:
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.
Ясно, что a и b не являются одним и тем же типом, поскольку они имеют разные размеры.
В большинстве случаев имя массива "распадается" на указатель на его собственный первый элемент. Вы можете думать об этом как о автоматическом преобразовании. Результатом является rvalue, что означает, что оно "просто" значение указателя и не может быть назначено, подобно тому, как имя функции распадается на указатель функции. Не означает, что он "const" как таковой, но не может быть назначен.
Итак, массив "есть" указатель, похожий на функцию "есть" указатель на функцию, или long "is" - int. То есть на самом деле это не так, но вы можете использовать его как один в большинстве контекстов благодаря преобразованию.