значение, на которое указывает указатель, используется для инициализации ссылки - PullRequest
1 голос
/ 23 апреля 2020

хорошо, у меня есть тривиальное сомнение в следующем утверждении

int a = 5;
int* ptr = &a; 
int &x = *ptr;
x = 3;
cout<<a;

вывод равен 3; *ptr передает разыменованное целое число vaue в справочную ссылку &x, но при изменении x изменяется a ?. *ptr просто бросает целое число без адреса того места, куда оно указывает. Почему компилятор связывает x с a's адресом ??

Ответы [ 3 ]

2 голосов
/ 23 апреля 2020

После этого объявления

int* ptr = &a; 

указатель ptr указывает на объект a.

Разыменование указателя

int & x = * ptr;

возвращает ссылку lvalue на исходный объект a,

Таким образом, x теперь является ссылкой lvalue на объект a.

Эффект такой же, как если бы изначально вы писали

int &x = a;

Из стандарта C ++ (5.3.1 унарные операторы)

1 Унарный оператор * выполняет косвенное обращение: выражение, к которому он применяется, должно быть указателем на тип объекта или указатель на тип функции и результат является lvalue, ссылающимся на объект или функцию , на которые указывает выражение.

1 голос
/ 23 апреля 2020

Есть такая замечательная функция, которую вы могли бы сделать с C ++.

Вы когда-нибудь пробовали это раньше?

void somefunction(int &foo) {
     foo = 3;
}

И когда вы использовали эту функцию следующим образом:

int a = 5;
somefunction(a);
// From now on, a = 3

a изменит свое значение на 3.

То же самое здесь, в вашем коде, вы разыменовали значение, но в то же время вы передаете a в x.

Это довольно полезно, когда Вы передаете объекты. И вы не хотите делать что-то подобное somefunction(&a). Это делает ваш код чище.


Извините, я на мобильном телефоне и пока не знаю, как форматировать посты.

1 голос
/ 23 апреля 2020

но каким образом изменение x меняет a?

Вы не можете "изменить" ссылки. Когда вы присваиваете x, объект, обозначенный x, назначается. x относится к a, поэтому присвоение x является присвоением a.

Почему компилятор связывает x с адресом a ??

Учитывая, что указатель ptr указывает на a, перенаправление через указатель *ptr дает значение l, которое ссылается на a. Таким образом, если вы инициализируете ссылку x с таким выражением, ссылка будет привязана к a.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...