Имя действительно ли массива является постоянным указателем в C++?

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

int a[10]

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

16
задан vaxquis 9 August 2016 в 13:23
поделиться

2 ответа

Стандарт C ++ определяет, что такое массив и его поведение. Взгляните в указатель. Это не указатель, константа или что-то еще, и это не что-то еще, это массив.

Чтобы увидеть разницу:

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, означающее, что это «просто» значение указателя и не может быть присвоено, подобно тому, как имя функции превращается в указатель функции. Это не означает, что это «константа» как таковая, но ее нельзя присвоить.

Таким образом, массив "является" указателем, во многом как функция "является" указателем на функцию, или long "является" целым числом. То есть, на самом деле это не так, но вы можете использовать его в большинстве случаев благодаря преобразованию.

28
ответ дан 30 November 2019 в 17:04
поделиться

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

Начиная с 6.3.2.1/3 «Другие операнды / L-значения, массивы и указатели функций»:

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

6
ответ дан 30 November 2019 в 17:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: