传递给函数时如何将结构空化?

时间:2013-03-23 17:09:07

标签: c++ pointers reference struct null

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

虽然它没有传递给函数时工作正常,但是直接在main函数中完成。 我哪里出错?

2 个答案:

答案 0 :(得分:4)

作为参数传递给remove的指针被复制到函数中。函数内的head是该指针的副本。您将该副本设置为NULL,并将外部副本保持不变。您可以通过引用简单地获取指针:

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

请注意head类型中的&符号。这意味着它是“对node指针的引用”,并允许您精确引用传递的对象,而不是它的副本。

答案 1 :(得分:3)

问题是你传递的指针允许你修改它所指向的node,但你不能修改指针本身,因为指针本身是按值传递的。因此,您无法在remove函数中执行此操作:

node = NULL;

人们给你的一个解决方案是将它作为对指针的引用传递,就像在node *&head中一样,这完全正常。但是我相信你想知道这种事情的一般约定(修改指针本身)是通过传递一个双指针(即指向node的指针):

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

然后在main中传递指针的地址:

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

然后在remove中,您可以更改指针的值:

*head = NULL;

你当然也可以取消引用它:

(*head)->next; // etc