#import<iostream>
using namespace std;
int main()
{
//trying to test pointers & reference
int x = 5;
int y = 6;
int *p;
p = &y;
*p = 10;
int &r = x;
cout<<"X reference\n"<<&r<<"\n"<<"value:"<<r<<"\n";
r=y;
cout<<"Y reference\n"<<&r<<"\n"<<"value:"<<r<<"\n";
}
В этом коде я сначала назначил & r для x, а затем назначил r на y.
int &r = x;
определяет ссылку на переменную int.
Ссылки не могут изменить то, что они ссылаются после того, как они определены, поэтому строка
r=y;
присваивает x
значение, которое хранится в y
. Это не означает, что r
начнет ссылаться на y
. Любое присвоение или из r
будет обрабатываться так, как если бы оно было от x
.
Другой способ думать о ссылках - это как бы указательная переменная, которую вы не можете изменить, на что указывает, после того как она инициализирована, и любое появление их использования имеет неявный оператор разыменования (*
).
int& r = x
объявляет ссылку на x
, думает об этом как псевдоним. Поэтому, если вы дальше по строке измените x
, оно будет отражено в r
, например,
x = 10;
cout << r; // r is "updated" here, as it is a reference to 'x'
напечатает 10
.
С другой стороны, декларация int r = x
просто копирует значение x
в r
, то r
полностью не зависит от x
. Таким образом, модификация x
будет иметь абсолютно никакого эффекта на r
.
В некотором смысле ссылка - это "вид" синтаксического сахара для указателей, хотя на самом деле это не то же самое, поскольку вы не можете иметь неинициализированную ссылку.
import
?x
иy
в конце программы.