我正在看一些涉及地址的c ++代码,遇到了一些我不理解的行。
#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中存储的值分配给了地址。被注释掉的行怎么会返回错误?
答案 0 :(得分:1)
我不明白变量x分配给R地址的那一行
C ++的语法在这里可能会令人困惑,但是您所看到的并不是将变量分配给地址。
此处的&符号具有不同的含义:R
是类型int&
的变量,即对整数的reference。这并不意味着“使用R的地址”。这或多或少意味着R
现在是x
的别名。它的行为类似于int
,而不像int*
(指向int的指针)。如果您打印它们的值,您会发现它是相同的,并且如果您更改其中一个,您还将更改另一个。
您可以查看this question,以获得对参考文献的全面说明。
答案 1 :(得分:1)
一种查看方法是将参考符号从中移出
int &R = x;
到
int& R = x;
R
是int&
-引用int
,这意味着{{1}时R
不会释放x
分配的内存}}超出范围,但在R
存在时,它将引用x
。特此声明x
,并且其声明不能更改,因此,如果您尝试:
R
它必须失败-因为已经声明了<type declaration> R = <value>
。
但是您可以将分配给R
所引用的任何内容
R
...只要将R = <value>
类型转换为value
所引用的类型(即可使用0-1转换运算符)。
答案 2 :(得分:0)
我不明白变量x分配给 R的地址
int &R = x;
上面的行声明了名为reference-to-int
的{{1}},并使其引用已经存在的变量R
。也就是说,在上一行下面的函数中的任何代码中,x
将充当R
的别名。
x
上面的行(未注释时)会产生错误,因为//int &R = &x; // ERROR!
右侧的值为=
类型(即,它是一个指向int的指针),而int *
左侧的值是=
类型(即它是对int的引用)。
在C ++中,引用在某些方面类似于指针,但是就其语法而言,它们大多遵循与其所引用类型相同的规则-这是因为它们充当该类型值的别名。 。因此,在这种情况下,就像您无法为int &
分配指针一样,您也无法为int
分配指针:
int &