在C中进行函数调用后,指针不会改变

时间:2012-02-06 05:08:21

标签: c pointers linked-list

我有一个链接列表的popFront函数:

Node* popFront(Node* list)
{
    Node* returnMe = (Node*)malloc(sizeof(Node));
    Node* oldHead = list;

    returnMe->mData = list->mData;

    if (list->mNext != NULL)
        list = list->mNext;  // This line is definitely called
    else
        list = blankNode;    // And not this one

    free(oldHead);

    return returnMe;
}

但每当我这样称呼它时:

Node* list = buildList(10);
Node* oldHead = popFront(list);

printInfo(list);

'oldHead'是正确的,但'list'仍然有它的第一个节点。

3 个答案:

答案 0 :(得分:2)

您需要了解按值传递按引用传递的区别。指针list将传递给函数{{1} } 按值,表示其值被复制到函数中的局部变量中。更改该副本时,popFront()之外的原始变量保持不变。如果您希望能够更改popFront()的值,则需要将指针传递给list(即,通过引用传递 >)并相应地修改list以使用指向popFront()的指针。

答案 1 :(得分:2)

以下是一个更简单的例子:

void foo(int x)
{
   x = 2;
}

int main()
{
  int x = 3;

  foo(x);
  // if you understand why x is still 3 here,
  // then you'll understand your problem as well.

  return 0;
}

答案 2 :(得分:1)

如果要更改变量list,则需要通过指针传递它。由于list的值为Node*,因此您需要传递popFront的签名为Node* popFront(Node **list)