C++ ссылка и связь указателя
Извините за вопрос noob, меня просто немного смущает связь между указателем и ссылкой в C++.
Какое из следующих действий является (является) законным в C++?
- Указатель на указатель;
- Указатель на ссылку;
- Ссылка на указатель;
- Ссылка на ссылку;
Я знаю, что указатель на указатель полностью допустим, то есть:
int* p;
*p = 5;
int ** pp;
*pp = p;
(Я не знаю, правильно ли я поступаю.)
Может ли кто-нибудь прояснить это для меня с помощью некоторых нетривиальных примеров? Спасибо.
4 ответа
Указатель на указатель:
Ваш пример, демонстрирующий указатель на указатель, был семантически верным, за исключением того факта, что вы не выделяли память для p
,
Указатель на ссылку:
Там нет такой вещи.
Ссылка на указатель:
Ссылки на указатели действуют так же, как ссылки на не указатели. Они позволяют наложение объекта через другой объект. Например:
int *p = new int;
int *& ref = p;
ref = new int(5);
std::cout << *p; // 5
Они также облегчают передачу указателя в качестве изменяемого параметра. В C можно было бы послать адрес указателя на функцию, если он должен был быть изменен:
void f(int **ptr)
{
*ptr = new int(10);
}
int *p;
f(&p);
В C++ мы можем просто использовать ссылку на указатель, так что это явно не нужно:
void f(int *&ptr)
{
ptr = new int(10);
}
int *p;
f(p);
Ссылка на ссылку:
Там нет такой вещи. Ты думаешь о T&&
? Это rvalue-ссылка, важный аспект семантики перемещения.
связь между указателем и ссылкой в C++
Никто. Там нет никаких отношений. Они совершенно разные.
Какое из следующих действий является (является) законным в C++?
Указатель на указатель и ссылка на указатель. Указатель на ссылку и ссылка на ссылку не существуют.
(Я не знаю, правильно ли я поступаю.)
Это не так: фрагмент, который вы опубликовали, вызывает неопределенное поведение (как есть), поскольку вы разыменовываете неинициализированные указатели.
Вы можете иметь:
- Указатель на указатель:
int** i
- Ссылка на указатель:
int* &i
Вы не можете иметь:
- Указатель на ссылку
- Ссылка на ссылку
Первое, что нужно понять, это основные понятия. Указатель - это переменная, которая содержит адрес другого объекта. Ссылка - это псевдоним другого объекта, то есть создает новое имя для существующего объекта.
Здесь самое важное, что после инициализации ссылки имя относится к реальному объекту, а не к ссылке.
С этим в мыслях,
у вас может быть указатель на указатель?
Да, указатель - это переменная, которая содержит адрес. Другой указатель может содержать адрес этого первого указателя.
Вы можете иметь ссылку на ссылку? т.е. вы можете иметь псевдоним к псевдониму?
Нет, псевдоним представляет реальный объект, который живет где-то еще под другим именем. Вы можете создавать новые псевдонимы, которые ссылаются на тот же объект, но вы не можете создать псевдоним для псевдонима.
Вы можете иметь ссылку на указатель? т.е. вы можете псевдоним указатель?
Да, вы можете ссылаться на переменную типа указателя. Тот факт, что переменная содержит объект указателя типа или типа int, не имеет значения, это переменная, и вы можете создать псевдоним.
Вы можете создать указатель на ссылку? т.е. вы можете создать указатель на псевдоним?
Нет, псевдоним - это просто другое имя только для одной переменной, вы можете иметь указатель на исходную переменную, и для его получения вы можете использовать либо исходное имя, либо псевдоним, но вы не можете иметь указатель на псевдоним.