引用指针

时间:2017-05-18 11:34:37

标签: c++ pointers reference

我只是在两个陈述之间有点困惑。

1

    int a = 42;
    int *p = &a; //declares pointer p to a
    int &r = *p; //this is not the way to declare a reference to a pointer, but what does this statement do

要打印值,可以通过

完成
    cout << a << *p << r;

以上所有内容都会打印a的值,但是如何,这就是我想知道的。

  1. 现在这就是如何定义对指针的引用

    int i = 42;
    int *p;
    int *&r = p; //declares reference r to pointer p
    r = &i; //stores the address of i in pointer p
    
  2. 我只想了解为什么第一个没有定义对指针的引用。

3 个答案:

答案 0 :(得分:5)

在此代码段中

int a = 42;
int *p = &a; //declares pointer p to a
int &r = *p; //this is not the way to declare a reference to a pointer, but what does this 

表达式*p产生对象a的左值,因为指针p指向对象。所以这个宣言

int &r = *p;

使用通过指针a间接访问对象来声明对同一对象p的引用。

来自C ++标准(5.3.1一元运算符)

  

1一元*运算符执行间接:表达式   应用它应该是指向对象类型的指针,或指向a的指针   函数类型,结果是引用对象或的左值   表达式指向的函数。如果是表达式的类型   是“指向T的指针”,结果的类型是“T”。 [注意:间接   通过指向不完整类型(cv void除外)的指针是有效的。   如此获得的左值可以以有限的方式使用(例如,初始化参考);此左值不得转换为   prvalue,见4.1。 - 后注]

问题中提到的两个代码片段之间的区别在于,在第一个代码片段中,通过指针使用间接方式声明了对类型为int的对象的引用(int a = 42;) 。在第二个代码片段中,声明了对指针的引用(int * p;)。

答案 1 :(得分:4)

让它分解(从右到左):

int &r = *p; 

*p  

取消引用指针

和这个

int& r

是参考声明

最后

int& r = *p;

相当于

int& r = a;

示例:

int main()
{
    int a = 42;
    int *p = &a; //declares pointer p to a
    int &r = *p;

    cout << "a: " << a << endl;
    cout << "r: " << r << endl;

    cout << "changing a:" << endl;
    a = 17;
    cout << "a: " << a << endl;
    cout << "r: " << r << endl;
    cout << "changing r:" << endl;

    r = 0;
    cout << "a: " << a << endl;
    cout << "r: " << r << endl;

    cin.get();
    return 0;
}

答案 2 :(得分:0)

这是因为在第一种情况下,您刚刚声明了对int的常规引用,并为其分配了 * p ,这是一个int。 * p 不是指针,而是指针p指向的值 - 在这种情况下,它只是 a 的值。