2016-02-18 2 views
-1

У меня есть это:Как сделать ссылку указателя на массив работы?

int gRealArray[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
int*& gArrayPtrTest = *reinterpret_cast<int**>(gRealArray); 

ASSERT_EQ(gArrayPtrTest[0], 1); 
ASSERT_EQ(gArrayPtrTest[1], 2); 

Я ожидаю, что gArrayPtrTest [0] должен быть таким же, как gRealArray [0], однако вместо этого он выходит из строя, так как значение указателя 1. Что такое правильный способ получить a int * &, который позволяет мне использовать оператор [] для доступа к указанному массиву?

+3

Какова цель этого? – NathanOliver

+0

Я нахожу какой-то произвольный адрес в hook to to int * &, я знаю его массив, но я еще не знаю размер. Поэтому я хочу использовать указатель, как если бы это был массив, который, я уверен, должен работать? Edit - отсюда этот небольшой тестовый пример без кастования случайных местоположений 0xdeadbeef. – paulm

+0

Если мне не хватает чего-то, если адрес представляет массив 'int', то вы можете просто' int * foo = address_of_array' – NathanOliver

ответ

0

Ссылка должна что-то указать. В примере кода вы пытаетесь создать ссылку, которая не имеет значения l-value. Рассмотрим это: если вы установите gArrayPtrTest на что-то еще, какая переменная действительно обновится? C++ позволит это, если gArrayPtrTest определяется как const, поскольку он может управлять значением r за кулисами. Помимо const, ссылка должна ссылаться на что-то. И C++ будет обрабатывать ссылки для вас, поэтому reinterpret_cast не нужен (и очень опасно пытаться использовать!).

Создайте переменную, содержащую фактический адрес указателя, а затем создайте ссылку на это. Ссылка не константные в этом примере, поэтому он может быть направлен на что-то еще позже:

int gRealArray[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
int * gAddressOfArray = gRealArray; 
int* & gArrayPtrTest = gAddressOfArray; 

И в этом случае, если вы решите написать:

int gAnotherRealArray[10] = { -1, -2, -3, -4, -5, -6, -7, -8, -9, -10 }; 
gArrayPtrTest = gAnotherRealArray; 
1

Чтобы получить то, что вы хотите , вам нужна ссылка const на указатель int. Используя ваш пример:

int* const& gArrayPtrTest = gRealArray; 

Это потому, что gRealArray является int массив и может быть правильно, неявно приводится к указателю на int, но не указатель на указатель на int. Но поскольку вам нужна ссылка на указатель, он должен быть ссылкой на константу. Я не уверен, как объяснить, почему, но я думаю, что это связано с тем, что указатель является выражением rvalue. Другими словами, это будет скомпилировать и запустить правильно:

int *foo = gRealArray; 
int *& gArrayPtrTest = foo; 

Но это не делает:

int *& gArrayPtrTest = gRealArray; 

Поскольку указатель не хранится в памяти в любом месте; это результат неявного броска.

Смежные вопросы