为什么c++语法是&address=variable而不是&address=&variable?

问题描述 投票:0回答:2

我最近开始学习 C++ 中的指针和引用,并且很难理解为什么引用的语法是

&address = variable
而不是
&address = &variable
。在我看来,后者是正确的语法是有意义的,因为它指出“地址”变量和“变量”变量共享相同的地址,并且两个变量也共享相同的值。前者对我来说没有意义,因为它会说“地址”变量的地址等于“变量”变量的值。

int main () {
    int a = 5;
    int &c = a;
    cout << &c << endl << &a << endl;
}

我已经尝试过上面的代码,它输出相同的内存地址,这进一步让我相信我认为语法应该是 &c = &a 是正确的,但我仍然不太确定。

c++11 pointers reference memory-address
2个回答
0
投票

当您声明

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


0
投票

我最近开始学习c++中的指针和引用

FWIW,您的代码显示您使用 C++ 引用,而不是指针。 指针不是引用

为什么引用的语法是

&address = variable
而不是
&address = &variable

这不是分配引用的语法:您正在混淆两个不同的东西:

    声明引用的语法
  • (请注意,&标记可以类似于:
    int& i_am_a_ref
    int &i_am_a_ref
    两者是等效的
    获取变量地址的语法(
  • &someVariable
  • )
    
    
  • C++ 中的指针本身就是值,并且可以直接编辑(这就是我们可以进行指针算术的原因),但引用不是:声明为引用的“变量”(如您的
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.

GCC 给了我这个错误

<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')

© www.soinside.com 2019 - 2024. All rights reserved.