Различие между указателем на ссылку и ссылкой на указатель

Каково различие между указателем на ссылку, ссылку на указатель и указателем на указатель в C++?

Где нужно быть предпочтен по другому?

42
задан Escualo 14 December 2009 в 02:18
поделиться

5 ответов

Во-первых, ссылка на указатель похожа на ссылку на любую другую переменную:

void fun(int*& ref_to_ptr)
{
    ref_to_ptr = 0; // set the "passed" pointer to 0
    // if the pointer is not passed by ref,
    // then only the copy(parameter) you received is set to 0,
    // but the original pointer(outside the function) is not affected.
}

Указатель на ссылку недопустим в C ++, потому что - в отличие от указателя - ссылка - это просто концепция что позволяет программисту создавать псевдонимы для чего-то еще. Указатель - это место в памяти , которое имеет адрес чего-то еще, но ссылка НЕ ​​является.

Теперь последний пункт может быть не совсем ясным, если вы настаиваете на работе со ссылками как указателями. например:

int x;
int& rx = x; // from now on, rx is just like x.
// Unlike pointers, refs are not real objects in memory.
int* p = &x; // Ok
int* pr = ℞ // OK! but remember that rx is just x!
// i.e. rx is not something that exists alone, it has to refer to something else.
if( p == pr ) // true!
{ ... }

Как видно из приведенного выше кода, когда мы используем ссылку, мы не имеем дела с чем-то отдельным от того, на что она ссылается. Итак, адрес ссылки - это просто адрес того, на что она ссылается. Вот почему не существует такой вещи, которая называется адресом ссылки в терминах того, о чем вы говорите.

54
ответ дан 26 November 2019 в 23:24
поделиться

Указатель на указатель

Указатель в C ++ - это просто значение, в котором хранится место в памяти (обычно как 32-битное значение).

Давайте скажем, у вас есть целочисленное значение, введенное пользователем ( 78 == 0x4E в шестнадцатеричном формате).

Оно будет храниться в памяти аналогичным образом (я намеренно упрощаю вещи для этого примера):

Memory address    Value
0x12345678        0x0000004E

Если вы хотите создать «указатель» на это значение, это будет выглядеть в памяти следующим образом:

Memory address    Value
0x22334455        0x12345678

По адресу памяти 0x22334455 теперь у вас есть «указатель» значение которого равно 0x12345678 или адрес памяти, в котором хранится целочисленное значение, введенное пользователем ( 0x4E ).

Предположим, вы хотели создать «указатель» на этот указатель ценность. Это будет выглядеть так:

Memory address    Value
0x11335577        0x22334455

Теперь у вас есть новый " но это выходит за рамки вашего вопроса.

Ссылки имеют ограничения по сравнению с другими типами в C ++ - например, вы должны всегда инициализировать ссылку для «ссылки» на реальный объект при его создании, в то время как указатель может указывать на недопустимую или неинициализированную память.

Указатель на ссылку

Не существует. Как говорилось ранее, ссылка - это просто псевдоним другого объекта. Вы не можете «указать» на ссылку, потому что это не объект сам по себе, а просто другое имя для реального объекта.

Конечно, вы можете иметь указатель на объект, на который ссылается ссылка. Но теперь мы снова находимся на территории обычных указателей.

Замечание о параметрах

Когда вы передаете параметр по значению методу или подпрограмме, вы, по сути, передаете "

44
ответ дан 26 November 2019 в 23:24
поделиться

Указателя на ссылку не существует.

10
ответ дан 26 November 2019 в 23:24
поделиться

Просто попробуйте сами и убедитесь, что в каждой вещи есть. Программа-пример просто выводит значение int и адреса различных сущностей:

#include<stdio.h>

int main(){
  int myInt ;
  int *ptr_to_myInt = &myInt;
  int *ptr_to_myInt_ref = ptr_to_myInt;

  myInt = 42;

  printf("myInt is %d\n",myInt);
  printf("ptr_to_myInt is %x\n",ptr_to_myInt);
  printf("ptr_to_myInt_ref is %x\n",ptr_to_myInt_ref);
  printf("&ptr_to_myInt is %x\n",&ptr_to_myInt);

  return 0;
}

Вывод:

myInt is 42
ptr_to_myInt is bffff858
ptr_to_myInt_ref is bffff858
&ptr_to_myInt is bffff854

Итак, указатель на int и указатель на ссылку на int - это одно и то же. Это очевидно из кода, потому что указатель на ссылку - это просто еще один способ псевдонима указателя (он говорит: «Держите для меня следующий адрес»).

Теперь указателю также требуется некоторое пространство в памяти, и если вы напечатаете ссылку на этот указатель (последний оператор printf), он просто укажет место в памяти, где находится указатель.

0
ответ дан 26 November 2019 в 23:24
поделиться

Ссылка - это абстракция от указателей. Ссылки немного сложнее ошибиться, особенно для новичков, и они немного более высокого уровня.

Вам не нужны ссылки. Вы всегда можете использовать указатели. Однако иногда код легче читать с их помощью.

Типичным примером для начинающих является связанный список. Представьте, что у вас есть переменная с именем «список», которая содержит указатель на первую переменную. Если вы хотите добавить что-то в голову, вам нужно указать свой add () двойной указатель, так как он должен иметь возможность изменять «голову». Однако вместо этого вы можете использовать ссылку на указатель. Здесь мы хотим использовать указатели в самом списке, поскольку мы будем их изменять, но функция add () будет более понятной, если мы передадим ссылку на заголовок списка вместо двойного указателя.

Это просто выбор стиля. Если вы работаете над большим проектом, вам следует придерживаться его стиля. Если нет, вы можете использовать то, что считаете предпочтительным. Однако вам должно быть комфортно использовать все стили, если вы даже надеетесь стать умеренно успешным программистом на C ++.

Также стоит отметить, что у вас не может быть указателя на ссылку. Это потому, что ссылки на самом деле являются просто другим именем для другой переменной, которая может находиться в какой-то другой области. Указатель на ссылку не имеет смысла. Что вам действительно нужно, так это просто указатель на исходные данные, без ссылок.

удобно использовать все стили, если вы даже надеетесь стать умеренно успешным программистом на C ++.

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

удобно использовать все стили, если вы даже надеетесь стать умеренно успешным программистом на C ++.

Также стоит отметить, что у вас не может быть указателя на ссылку. Это потому, что ссылки на самом деле являются просто другим именем для другой переменной, которая может находиться в какой-то другой области. Указатель на ссылку не имеет смысла. Что вам действительно нужно, так это просто указатель на исходные данные, без ссылок.

5
ответ дан 26 November 2019 в 23:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: