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

Posted

技术标签:

【中文标题】返回后指针不会从函数返回到它的引用(保持为空)C++【英文标题】:pointer won't go back to it's reference from a function after return (stays null) C++ 【发布时间】:2016-04-24 23:27:28 【问题描述】:

我使用的是我自己用 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 HAS 有一个值并在行之后:

main = pol;

main 实际更改为指向 pol 指向的内容。但是在 AddChain 中返回后,AddChain 中 mainadd 仍然是 NULL。它没有从函数中取回值,也没有像按值而不是按引用那样更改添加的指针,而是按引用。

是什么导致了这个问题?

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

【问题讨论】:

您按值传递指针。想想吧。 【参考方案1】:

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

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);

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

【讨论】:

当我尝试使用 &(&L)) 传递 PolyChain 时,我遇到了常规类型的问题 @Ofek .T.编译器说了什么? 用 &(&) 表示 - 表达式必须是左值或函数指示符 @Ofek .T.你试过最后一个例子吗? 当然指针地址 (&*) 会起作用,但这会强制每次我想使用该函数来发送它,然后接收它时创建一个指针,该变量将毫无意义对我来说,这只是代码使用方面的额外工作【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:
void AddChain(PolyChain* pol, PolyChain* main)
...
        main = pol;
        return;

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

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

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

【讨论】:

但是如果我这样做了,如何将 PolyChain 传递给函数?使用 PolyChain* 我只会做 &variable_name,但现在这不适合 @Ofek .T.以相同的方式。 AddChain(&pol, &main) 其中polmainPolyChain 类型的变量。 它没有。 PolyChain l = MakeChain(2, 2, NULL); AddChain(&MakeChain(1, 4, NULL), &l);给我错误说它不正确 @Ofek .T.你有没有尝试做,我发布了亲爱的?它当然必须有效。 @Ofek .T.我还注意到你的 make 链函数返回一个值。你把它放在哪里了?

以上是关于返回后指针不会从函数返回到它的引用(保持为空)C++的主要内容,如果未能解决你的问题,请参考以下文章

C++ 把引用作为函数返回值

C ++从函数返回指向数组的指针的正确方法

构造函数的对象引用?

16. 指针函数和函数指针

在c语言中子函数引用主函数中的值和引用主函数某个值的地址的区别

C 从函数返回指针