Я пытаюсь написать код C++, который выдает адрес указателя, который сам по себе является указателем. Вот что у меня есть:
int val = 10;
int **a = &(&val);
Я получил ошибку
lvalue required as unary '&' operand
int **a = &(&val);
Я получил правильный вывод, когда использовал следующий код:
int val = 10;
int *p = &val;
int **a = &p;
Может ли кто-нибудь объяснить, почему первая версия неверна?
Я попытался напрямую получить адрес адреса val, используя &(&val). Я ожидал, что это даст мне указатель на указатель, так же, как использование &p работает во втором примере.
@molbdnilo Поскольку 10 — это буквальная константа, а не переменная, верно? Так что это будет недействительно
Первая версия вашего кода терпит неудачу, потому что вы пытаетесь взять адрес выражения &val
, которое является rvalue (временным значением) и не имеет постоянного адреса в памяти. В C++ вы можете взять только адрес lvalue (переменной с адресом постоянной памяти).
Во второй версии вы сначала сохраняете &val
в переменной p
, которая является lvalue, а затем можете взять адрес p
, что работает правильно.
Итак, чтобы решить проблему, вам нужно использовать переменную (например, p
) для хранения адреса val
, прежде чем пытаться получить его адрес.
Та же ситуация, что и
int* p = &10;
. Вы понимаете, почему это не работает?