Как понять адрес входа в C ++ - PullRequest
0 голосов
/ 19 января 2019

Я смотрю на некоторый код на С ++, который включает адреса и натолкнулся на некоторые строки, которые я не понимаю.

#include <iostream>

int main()
{
    int x = 5;
    int &R = x;
    //int &R = &x;   // ERROR!

    std::cout << "R address: " << &R << "\n";
    std::cout << "R number: " << R << "\n";
}

Код работает, как и ожидалось, однако я не понимаю строку, где переменная x назначена адресу R. Я понимаю, что это будет ошибкой, поскольку вы присваиваете значение, хранящееся в x, адрес. Как получается, что закомментированная строка возвращает ошибку?

Ответы [ 3 ]

0 голосов
/ 19 января 2019

Я не понимаю строку, где переменная x назначена адресу R

Синтаксис C ++ может сбивать с толку, но то, что вы видите, не является переменнойприсваивается адресу.

Здесь амперсанд имеет другое значение: R - это переменная типа int&, то есть ссылка на int.Это не значит «взять адрес R».Более или менее это означает, что R теперь является псевдонимом x.Он ведет себя как int, а не как int* (указатель на int).Если вы напечатаете их значение, вы обнаружите, что это то же самое, и если вы измените одно из них, вы также измените другое.

Вы можете взглянуть на этот вопрос дляподробное объяснение ссылок.

0 голосов
/ 19 января 2019

Один из способов взглянуть на это - переместить ссылочный знак с

int &R = x;

на

int& R = x;

R - это int& - ссылка на int, что означает, что R не освободит память, выделенную x, когда R выйдет из области видимости, но это будет ссылка на x, пока x живет.Настоящим объявляется R, и его объявление не может быть изменено, поэтому, если вы попытаетесь:

<type declaration> R = <value>

, оно должно завершиться неудачей - поскольку R уже объявлено.

Но вы можете присваивать что-либо тому, что R является ссылкой на

R = <value>

... до тех пор, пока value тип может быть преобразован в тип, на который ссылается R (0-1 преобразование операторов).

0 голосов
/ 19 января 2019

Я не понимаю строку, где переменная x назначена адрес R

int &R = x;

В приведенной выше строке объявляется reference-to-int с именем R, и он ссылается на уже существующую переменную x. то есть в любом коде функции под строкой выше, R будет действовать как псевдоним для x.

//int &R = &x;   // ERROR!

Приведенная выше строка (когда она не закомментирована) выдает ошибку, поскольку значение в правой части = имеет тип int * (т. Е. Это указатель на int), а значение слева сторона = имеет тип int & (то есть это ссылка на int).

В C ++ ссылки действуют в некотором смысле как указатели, но с точки зрения их синтаксиса они в основном следуют тем же правилам, что и тип, на который они ссылаются - это потому, что они действуют как псевдонимы для значения этого типа. , Так что в этом случае, так же как вы не можете назначить указатель на int, вы также не можете назначить указатель на int &:

int R = &x;   // This would also be an error
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...