2013-03-23 83 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