c ++指针引用混乱

时间:2011-03-20 02:20:45

标签: c++

    struct leaf
    {
        int data;
        leaf *l;
        leaf *r;
    };
    struct leaf *p;


void tree::findparent(int n,int &found,leaf *&parent)

这是BST的一段代码。我想问一下。为什么

 leaf *&parent

为什么我们需要“参考标记”?

父母也是一片叶子,为什么我不能只使用leaf* parent

以下代码供您参考。谢谢!

void tree::findparent(int n,int &found,leaf *&parent)
{
    leaf *q;
    found=NO;
    parent=NULL;

    if(p==NULL)
        return;

    q=p;
    while(q!=NULL)
    {
        if(q->data==n)
        {
            found=YES;
            return;
        }
        if(q->data>n)
        {
            parent=q;
            q=q->l;
        }
        else
        {
            parent=q;
            q=q->r;
        }
    }
}

2 个答案:

答案 0 :(得分:7)

您正在通过引用在中传递指针parent,以便您可以修改该指针:

parent=q;

如果您通过值传递中的指针,则修改将是指向函数末尾过期的指针的副本。

答案 1 :(得分:0)

使用REFERENCE TO POINTER时,可以更改指针的值。您可能需要在链接列表实现中使用此模式来更改列表的头部。

void passPointer(int *variable)
{
    *variable = (*variable)*2;
    variable = NULL; // THIS CHANGES THE LOCAL COPY NOT THE ACTUAL POINTER
}
void passPointerReference(int* &variable)
{
    *variable = (*variable)*3;
    variable = NULL; // THIS CHANGES THE ACTUAL POINTER!!!!
}
int main()
{    
    int *pointer;
    pointer = new int;
    *pointer = 5;
    passPointer(pointer);
    cout << *pointer; // PRINTS 10
    passPointerReference(pointer);
    cout << *pointer; // GIVES ERROR BECAUSE VALUE OF pointer IS NOW 0.
    // The constant NULL is actually the number 0.
}