Есть ли у имени массива, когда оно используется как указатель, адрес в памяти?
Имя массива может может служить указателем. Можно проверить, какой размер занимает указатель( по сути имя массива ). cout << sizeof(&arr) << endl; или cout << sizeof(arr+0) << endl; Но раз указатель занимает 4 или 8 байт ( в зависимости от конфигурации x64 или x84 ), то у него должен появляться какой-то адрес, у самого указателя. Вопрос: как получить этот адрес? Этот адрес должен же быть отличным от адресов элементов массива, т.к. это указатель, если проводить аналогию. Или для массива адрес указателя( его имени ) вывести на экран нельзя??? Но он же есть, раз занимает какое-то место в памяти. Вопрос именно по c++.
Ответы (1 шт):
Указатель, получающийся из массива неявным преобразованием, вычисляется на месте. До преобразования он не существует и нигде не хранится.
Это временный объект 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, т. е. временный указатель оказался на стеке рядом с массивом.