我最近开始学习 C++ 中的指针和引用,并且很难理解为什么引用的语法是
&address = variable
而不是 &address = &variable
。在我看来,后者是正确的语法是有意义的,因为它指出“地址”变量和“变量”变量共享相同的地址,并且两个变量也共享相同的值。前者对我来说没有意义,因为它会说“地址”变量的地址等于“变量”变量的值。
int main () {
int a = 5;
int &c = a;
cout << &c << endl << &a << endl;
}
我已经尝试过上面的代码,它输出相同的内存地址,这进一步让我相信我认为语法应该是 &c = &a 是正确的,但我仍然不太确定。
当您声明
int &c
时,您指定将有一个类型为 c
的 int &
变量。在同一行中,您将 a
分配给 c
,令您感到困惑的部分是您认为自己正在做
&c = a
但你本质上是在做
c = a
让我们将声明与赋值分开以获取示例空间:
#include <iostream>
int main() {
int a = 5;
int d = 6;
int &b = a;
int &c = b;
c = a;
std::cout << b << "\n" << c;
}
输出:
5
5
参见h
我最近开始学习c++中的指针和引用
FWIW,您的代码显示您使用 C++ 引用,而不是指针。 指针不是引用。
为什么引用的语法是
而不是&address = variable
。&address = &variable
这不是分配引用的语法:您正在混淆两个不同的东西:
&
标记可以类似于:int& i_am_a_ref
或int &i_am_a_ref
,两者是等效的) 获取变量地址的语法(
&someVariable
c
)更好地理解为高另一个变量的级别
别名没有自己的身份(并且没有特定的实现或对C++程序员的具体化表示),因此为什么编译器会忽略local引用,而交叉引用函数边界(例如作为函数参数)可能在内部表示为指针(也存在其他可能的表示形式)。 我建议你将代码更改为这样
:
#include <iostream>
using std::cout;
using std::endl;
int main () {
int a = 5; // Declare local int `a` initialized to 5.
int& c = a; // Declare `c` as an alias - or reference - of `a`
cout << a << endl; // Print the value of `a` (i.e. "5")
cout << c << endl; // Print the value of `c` which is `a` which is still "5".
cout <<< &a << endl; // Print the address-of local-variable `a`, e.g. "0x7ffd8b2262e4".
cout <<< &c << endl; // Print the address-of local-variable `c`, which is an alias of `a`, hence it resolves to the same address: "0x7ffd8b2262e4"
return 0;
}
关于“分配”引用,请记住C++ 不允许引用
的重新绑定,即一旦c
被初始化为另一个变量的别名,您就不能随后更新
c
来引用另一个变量,因此,“分配引用”(即 c = 123
)always的语法意味着“解析引用,然后重新分配所指对象”(即
a
)并且永远不会“将 c
重新绑定到非引用int
值 123
”(无论如何类型系统都不允许这样做);所以你不能使用 &
重新绑定引用:...所以这行不通:
int a = 5;
int b = 6;
int& reference_to_a = a;
cout << a << endl; // "5"
cout << b << endl; // "6"
cout << reference_to_a << endl; // "5"
reference_to_a = b; // <-- This will update `a` to be `6`
cout << a << endl; // "6"
&reference_to_a = b; // <-- This is invalid syntax and results in a compiler error.
:
<source>: In function 'int main()':
<source>:21:1: error: lvalue required as left operand of assignment
21 | &reference_to_a = b;
| ^~~~~~~~~~~~~~~
Compiler returned: 1
同样,这些都不会编译(要么因为 GCC(带有
-Wall
)阻止您取消引用非指针类型,要么因为
&reference_to_a
不是左值)。
&reference_to_a = &b; // <-- lvalue required as left operand of assignment
&reference_to_a = *b; // <-- invalid type argument of unary '*' (have 'int')
*reference_to_a = &b; // <-- invalid type argument of unary '*' (have 'int')
*reference_to_a = *b; // <-- invalid type argument of unary '*' (have 'int')