指针在返回(保持 null)后不会从函数返回到它的引用C++

pointer won't go back to it's reference from a function after return (stays null) C++

本文关键字:返回 函数 C++ 引用 保持 null 指针      更新时间:2023-10-16

im 使用我自己用 stuct 制作的链表。该结构有 2 个整数和 1 个指向另一个结构的指针,下一个。

我正在使用LL(链表),但在其中一个函数中,某个指针不会改变。

AddChain( &MakeChain(..values..), added )

这就是我调用函数的方式,我向她发送了一条新链以链接到大链,如果没有大链,即它是 NULL,所以它会替换它。在此调用中添加了一个指向链结构的 NULL ptr。

void AddChain(PolyChain* pol, PolyChain* main) // adds the new piece to the chain
{
    PolyChain *current = main, *back = NULL;
    if (main == NULL)
    {
        pol->next = NULL;
        main = pol;
        return;
    }
... \ there is continuation of the function but it wont get so far without main one
}

现在,正如你所看到的,主链是否是一个NULL,我所做的引用与我得到的新链相同的东西。我在调试器中运行,pol 有一个值,并且在该行之后:

main = pol;

主要的实际变化指向 POL 所指向的内容。但是在AddChain中返回后,添加的AddChain中的节点仍然是NULL。它没有从函数中获取值,它没有更改添加的指针,就像它是按值而不是按引用一样,而是通过引用。

是什么导致了这个问题?

编辑:MakeChain返回一个PolyChain,AddChain得到PolyChain*,这就是我使用&的原因。

发生这种情况是因为您按值传递指针PolyChain* main。可视化"按值传递"的一种简单方法是将其视为"按副本传递":指针的副本是专门为调用AddChain而制作的。这就是为什么对AddChain内部指针的任何更改都保留在 AddChain 的本地

您可以通过三种不同的方式解决此问题:

  • 参考PolyChain*& main - 这是最简单的解决方案。 因为没有其他东西需要改变。
  • 通过指针获取PolyChain** main - 在这种情况下AddChain需要取消引用main,即使用 *main 而不是 main,并在将main传递给 AddChain 时获取指针
  • 返回具有新值 mainPolyChain* - 在这种情况下,调用方必须将结果赋值回传递给main的指针。
void AddChain(PolyChain* pol, PolyChain* main)
...
        main = pol;
        return;

在该代码中,main 是传入的任何指针的本地副本,因此分配给 main 对函数外部的指针没有影响。

您没有提供足够的信息让我推断您的意图,因此您可能(但不清楚)可以通过引用传递指针来解决问题:

void AddChain(PolyChain* pol, PolyChain*& main)

您正在更改指针的副本,因为您正在按值传递指针。如果要更改来自调用范围的指针,则必须传递指向指针的指针或指向指针的引用:

void AddChain(PolyChain*& pol, PolyChain*& main) {...}

必须使用指针到指针来修改函数内的指针值

void AddChain(PolyChain* pol, PolyChain** main)

比在您的代码中:

void AddChain(PolyChain* pol, PolyChain** main) // adds the new piece to the chain
{
    PolyChain *current = *main, *back = NULL;
    if (main == NULL)
    {
        pol->next = NULL;
        *main = pol;
        return;
    }
... \ there is continuation of the function but it wont get so far without main one
}

要将值传递给函数,只需调用

AddChain(pol, &main);

其中polmain是指向PolyChain类型的常规指针。

或使用简单值:

PolyChain* pMain = &main;
AddChain(&pol, &pMain);

注意:这种做法非常容易出错,因此您必须格外小心地以这种方式管理指针。