2011-03-20 209 views
2
struct leaf 
    { 
     int data; 
     leaf *l; 
     leaf *r; 
    }; 
    struct leaf *p; 


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

這是BST的一段代碼。我想問一下。爲什麼C++指針參考混淆

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; 
     } 
    } 
} 

回答

7

您通過引用傳遞指針parent,使您可以修改指針:如果您在通過指針

parent=q; 

按值,修改將是在函數結尾處過期的指針副本。

+0

要添加:否則,將需要'** parent' – 2011-03-20 02:24:22

+1

@布賴恩:代碼需要修改它之前被改變,也提領'parent'(一次)。 – Johnsyweb 2011-03-20 02:26:29

+0

感謝Johnsyweb。 – user658266 2011-03-20 02:34:12

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. 
}