2014-09-12 104 views
0

我有一個非常簡單的鏈接列表。如果我通過引用傳遞我的列表,我的addNode(Node* &list, int value)函數僅向鏈接列表添加新節點。如果我按價值通過我的列表,它不會:addNode(Node* list, int value)指針參數需要通過引用才能通過

我知道什麼pass by valuepass by reference是,但我認爲,一個指針函數參數本質上是通過引用傳遞,因爲指針指向的內存位置(是對實例的引用)。所以我認爲&是多餘的是不是?或者我錯了?

class Node 
{ 
public: 
    Node* next; 
    Node* prev; 
    int value; 

    Node(int nValue=0) : next(NULL), prev(NULL), value(nValue) { } 
    ~Node() { cout << "Deleting " << value << endl; } 
}; 

// Why do I need to pass by reference 'list'? 
// If I dont then the variable 'linkedList' (in main) doesn't have nodes added to it 
void addNode(Node* &list, int value) 
{ 
    Node* newNode = new Node(value); 
    newNode->prev = list; 
    list->next = newNode; 
    list   = newNode; 
} 

int main() 
{ 
    Node* linkedList = new Node(1); 
    addNode(linkedList, 2); 

    // TODO: release memory 

    system("PAUSE"); 
    return 0; 
} 
+2

不要將指向**指針**的指針與指向**指向的**混淆。它的指針位於列表頭部,需要根據輸入/輸出參數進行更改。它指向的內容僅被修改爲設置指向新節點的指針。 – WhozCraig 2014-09-12 10:39:57

+0

如果你的函數修改指針本身而不是指針值,那麼你需要通過引用來傳遞它。 – Medinoc 2014-09-12 10:54:05

回答

1

您的語句「指針函數參數本質上是通過引用傳遞」並不完全正確。您需要在一個指針傳遞給函數考慮到這一點,指針指向的東西,你真傳兩件事情:

  • 指針
  • 指針對象

因此,如果指針是按值傳遞,您有:

  • 指針按值傳遞
  • 指針對象引用
  • 0123傳遞

在這種情況下,您可以在函數中修改指針,但不能修改指針。

如果指針按引用傳遞,你必須:

  • 指針按引用傳遞
  • 指針對象引用

在這種情況下,通過您可以修改這兩個指針和指針對象。

2

這取決於。在你改變函數內的指針的情況下,你應該通過引用傳遞指針。另一方面,如果你不改變函數中的指針,那麼就沒有理由再添加另一個間接級別和引用傳遞。

並且不,指針不會被引用自動傳遞,它們像其他任何參數那樣通過值傳遞。如果你沒有通過引用傳遞,指針將被複制,你只能在副本上操作,而不是在原件上操作。

2

這裏的參考是必要的,因爲您試圖更改指針以及pointee

如果您通過指針傳遞Node,調用者將看到對指針的任何更改,但不會看到指針,因爲調用該函數時將創建指針的副本。如果您通過指針引用傳遞Node,調用者將看到對這兩者的更改。

+1

啊我看到'linkedList'的副本改變了,但沒有'linkedList'。 – nondescript 2014-09-12 10:42:29