如何了解C ++中的地址登录

时间:2019-01-19 02:33:20

标签: c++ pointers

我正在看一些涉及地址的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中存储的值分配给了地址。被注释掉的行怎么会返回错误?

3 个答案:

答案 0 :(得分:1)

  

我不明白变量x分配给R地址的那一行

C ++的语法在这里可能会令人困惑,但是您所看到的并不是将变量分配给地址。

此处的&符号具有不同的含义:R是类型int&的变量,即对整数的reference。这并不意味着“使用R的地址”。这或多或少意味着R现在是x的别名。它的行为类似于int,而不像int*(指向int的指针)。如果您打印它们的值,您会发现它是相同的,并且如果您更改其中一个,您还将更改另一个。

您可以查看this question,以获得对参考文献的全面说明。

答案 1 :(得分:1)

一种查看方法是将参考符号从中移出

int &R = x;

int& R = x;

Rint&-引用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 &