Есть ли у имени массива, когда оно используется как указатель, адрес в памяти?

Имя массива может может служить указателем. Можно проверить, какой размер занимает указатель( по сути имя массива ). cout << sizeof(&arr) << endl; или cout << sizeof(arr+0) << endl; Но раз указатель занимает 4 или 8 байт ( в зависимости от конфигурации x64 или x84 ), то у него должен появляться какой-то адрес, у самого указателя. Вопрос: как получить этот адрес? Этот адрес должен же быть отличным от адресов элементов массива, т.к. это указатель, если проводить аналогию. Или для массива адрес указателя( его имени ) вывести на экран нельзя??? Но он же есть, раз занимает какое-то место в памяти. Вопрос именно по c++.


Ответы (1 шт):

Автор решения: HolyBlackCat

Указатель, получающийся из массива неявным преобразованием, вычисляется на месте. До преобразования он не существует и нигде не хранится.

Это временный объект prvalue, поэтому он даже объектом не считается, и у него нет адреса. Точно так же, как у (не строковых) литералов вроде 42.

С prvalue можно сделать две вещи:

  • Им можно инициализировать объект (т. е. указатель), например так: int a[42]; int *b = a;. Тогда адрес a напрямую записывается в b, и никакой временный указатель не создается.

  • Его можно материализовать (temporary materialization) во временный объект, в xvalue.

Компилятор не дает напрямую взять адрес xvalue, но это искусственное ограничение. Можно сделать rvalue-ссылку на него, и взять адрес у ссылки:

#include <iostream>

int **foo(int *&&ptr) {return &ptr;}

int main()
{
    int a[42];
    std::cout << a << '\n';
    std::cout << foo(a) << '\n';
}

Я получил 0x7fff4ac52380 0x7fff4ac52378, т. е. временный указатель оказался на стеке рядом с массивом.

→ Ссылка