引用堆栈对象的地址

时间:2013-04-02 06:28:11

标签: c++ reference

我很难理解为什么下面的代码无法在Visual Studio 2012下编译,错误已经嵌入在下面的代码中。 我觉得它与引用堆栈对象有关,但不太确定。 有人可以帮忙吗?

由于

#include <iostream>

typedef struct Node {
    Node *next;
} Node;

void test(Node *&p) {
    p=p->next;
}

void main() {
    Node *p1=new Node();
    test(p1);   // this line compiles okay

    Node p={0};
    test(&p);    // error C2664: 'test' : cannot convert parameter 1 from 'Node *' to 'Node *&'
}

2 个答案:

答案 0 :(得分:2)

&p不是Node*类型的变量。它是Node*类型的常量。

即使你能以某种方式引用p并将其传递给test()p=p->next;仍会失败,因为你无法分配常量。

答案 1 :(得分:1)

您按地址传递变量,而不是通过引用传递变量的指针。我认为这会奏效:

void main() {
    Node *p1=new Node();
    test(p1);   

    Node p={0};
    Node* p2 = &p;
    test(p2);     
}