返回后指针不会从函数返回到它的引用(保持为空)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 中 main 的 add 仍然是 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);
其中pol
和main
是指向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)
其中pol
和main
是PolyChain
类型的变量。
它没有。 PolyChain l = MakeChain(2, 2, NULL); AddChain(&MakeChain(1, 4, NULL), &l);给我错误说它不正确
@Ofek .T.你有没有尝试做,我发布了亲爱的?它当然必须有效。
@Ofek .T.我还注意到你的 make 链函数返回一个值。你把它放在哪里了?以上是关于返回后指针不会从函数返回到它的引用(保持为空)C++的主要内容,如果未能解决你的问题,请参考以下文章