Подтвердить что ты не робот

Является ли имя массива постоянным указателем в С++?

У меня вопрос о имени массива a

int a[10]

Как имя массива определено в С++? Постоянный указатель? Это определяется как это или просто мы можем выглядеть так? Какие операции могут быть применены к имени?

4b9b3361

Ответ 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. То есть на самом деле это не так, но вы можете использовать его как один в большинстве контекстов благодаря преобразованию.

Ответ 2

Имя массива не является указателем константы - однако он действует как один во многих контекстах (он преобразуется в один на вид в значительной степени), что для большинства его целей.

Из 6.3.2.1/3 "Другие операнды /Lvalues, массивы и обозначения функций":

За исключением случаев, когда это операнд оператора sizeof или унарный оператор & или строковый литерал, используемый для инициализации массива, выражение, которое имеет тип "массив типа", преобразуется в выражение с введите "указатель на тип", который указывает на начальный элемент объекта массива и не является значением lvalue.