2013-03-23 80 views
2

我想在head-> next爲NULL的情況下爲NULL結構。 但是,當我將它傳遞給一個函數以將其設置爲空時它不起作用。如何將空結構傳遞給函數?

void remove(struct node* head) 
{ 
int val; 

cout << "Enter a value to delete: "; 
cin >> val; 

if (head->next == NULL) 
    if (head->data == val) 
    head = NULL; 
} 

雖然它沒有傳遞給函數時工作正常,但直接在主函數中完成。 我哪裏出問題了?

回答

3

問題是您傳遞的指針可以讓您修改它指向的node,但您無法修改指針本身,因爲指針本身是按值傳遞的。所以你不能在你的remove功能做到這一點:

node = NULL; 

,人們已經給你是把它作爲指針引用,如node *&head和這工作完全正常的溶液。不過,我相信你想知道,這樣的事情一般約定(修改指針本身)是通過傳遞一個雙指針(即指向指針node):在

void remove(node **head) { ... } 

然後主要傳遞給它的指針的地址:

node *theHead = blah; 
remove(&theHead); 
remove

然後你可以改變指針的值:

*head = NULL; 

,你可以ALS ο當然提及它:

(*head)->next; // etc 
+0

啊,好吧。 然後有一個問題。 node * theHead = NULL; 刪除(theHead); node * theHead = NULL; remove(&theHead); 第一個不會通過引用而不是值傳遞嗎? 第一個是指向地址的指針 而另一個解引用它。 或者我弄錯了? – user2180833 2013-03-23 17:25:12

+0

@ user2180833 Nah。在第一種情況下,你是通過值傳遞指針(但是'remove'可以解引用指針並修改該值;但是你不能修改指針本身,比如將它設置爲NULL)。第二,你傳遞它的指針地址。把它想象成更高一級的meta。引起混淆的一個原因是,在這種情況下,'&theHead'_並不意味着通過引用傳遞。在這個上下文中的&是用於初始化指針的地址運算符。 – 2013-03-23 17:27:43

+0

@ user2180833其中'&'表示通過引用傳遞的上下文在函數的參數中,例如,如果它是'void remove(node&head)',那麼如果你像這樣傳遞一個'node'值到'remove':'node someValue = whatever;刪除(someValue);'然後它會通過引用傳遞。 – 2013-03-23 17:29:02

4

作爲參數傳遞給remove的指針正被複制到函數中。函數內部的head是該指針的副本。您將該副本設置爲NULL,而外部的副本保持不變。你可以簡單地通過參看帶指針:

void remove(struct node*& head) 
{ 
    // ... 
} 

注符號中的head類型。這意味着它是「指向node的指針」,並讓您精確地引用傳遞的對象,而不是其副本。

+0

不是副本。我已經給出了地址: main {node} * head = NULL; 刪除(head); } – user2180833 2013-03-23 17:14:29

+0

@ user2180833是的,對'remove'的調用會將'head'指針的值複製到函數中。除非明確要求引用,否則C++使用按值傳遞語義。 – 2013-03-23 17:16:27