【问题标题】:Pointer isn't chaning after function calls in C指针在 C 中的函数调用后没有变化
【发布时间】:2012-02-06 05:08:21
【问题描述】:

我有一个用于链表的 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' 仍然有它的第一个节点。

【问题讨论】:

    标签: c pointers linked-list


    【解决方案1】:

    您需要了解按值传递按引用传递之间的区别。指针list被传递给函数popFront() by value,表示将其值复制到函数中的局部变量中。当您更改该副本时,popFront() 之外的原始变量不会改变。如果您希望能够更改list 的值,那么您需要将一个指针 传递给list(即,通过引用传递它)并修改popFront() 相应地使用指向 Node 的指针。

    【讨论】:

      【解决方案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;
      }
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 搞定了。我很困惑,因为我已经传递了一个指针,但我需要一个指向指针的指针。谢谢!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-28
        • 1970-01-01
        • 1970-01-01
        • 2014-10-06
        • 2015-08-31
        • 2021-09-17
        相关资源
        最近更新 更多