指针在返回(保持 null)后不会从函数返回到它的引用C++
pointer won't go back to it's reference from a function after return (stays null) C++
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
时获取指针 - 返回具有新值
main
的PolyChain*
- 在这种情况下,调用方必须将结果赋值回传递给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);
其中pol
和main
是指向PolyChain
类型的常规指针。
或使用简单值:
PolyChain* pMain = &main;
AddChain(&pol, &pMain);
注意:这种做法非常容易出错,因此您必须格外小心地以这种方式管理指针。
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 接收和返回函数指针的函数指针的类型?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- C++函数链返回函数
- 返回函数指针的函数的签名
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 如何在 C++ 中从 void 返回函数访问变量
- 返回函数中带有 2 个可选 ctor 的对象
- 如何在 c++ 中返回函数的结构向量
- 返回 C++ 函数中的引用
- 使用向量时,当返回函数更改时,无法看到输出
- 如何在递归中使用返回函数
- 返回函数模板的类型C++作为第二个模板参数
- 为什么静态指针返回函数中有一个"静态"键?
- 递归返回函数,在特殊情况下不返回
- 从类返回函数
- 从类成员函数返回函数指针
- 从返回函数中推断不存在的模板参数