C++ 指针赢了';别再回头了';返回(保持空)C++;
我用我自己用stuct制作的链表。该结构有2个int和1个指向另一个结构next的指针 我使用的是LL(链表),但在其中一个函数中,某个指针不会改变C++ 指针赢了';别再回头了';返回(保持空)C++;,c++,function,pointers,return,C++,Function,Pointers,Return,我用我自己用stuct制作的链表。该结构有2个int和1个指向另一个结构next的指针 我使用的是LL(链表),但在其中一个函数中,某个指针不会改变 AddChain( &MakeChain(..values..), added ) 这就是我调用函数的方式,我给她发送一个新的链接到大的链接,如果没有大的链接,也就是NULL,那么它将替换它。在此调用中,向链结构添加了一个空ptr void AddChain(PolyChain* pol, PolyChain* main) // adds
AddChain( &MakeChain(..values..), added )
这就是我调用函数的方式,我给她发送一个新的链接到大的链接,如果没有大的链接,也就是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
}
现在,你可以看到,如果主链是空的,我会引用与我得到的新链相同的东西。我在调试器中运行,pol有一个值,在该行之后:
main = pol;
main realy更改为指向pol所指向的内容。但是在AddChain中返回后,added作为AddChain中的主要元素仍然是空值。它没有从函数返回值,它没有改变added的指针,就像它是通过值而不是通过引用一样,但它是通过引用
是什么导致了这个问题
编辑:MakeChain返回一个PolyChain,AddChain得到PolyChain*,这就是为什么我使用&。您正在更改指针的副本,因为您正在按值传递指针。如果要更改来自调用作用域的指针,则必须传递指向该指针的指针或指向该指针的引用:
void AddChain(PolyChain*& pol, PolyChain*& main) {...}
在该代码中,main
是传入的任何指针的本地副本,因此分配给main
对函数外部的指针没有影响
您没有提供足够的信息让我推断您的意图,因此您很可能(但不清楚)可以通过引用传递指针来解决问题:
void AddChain(PolyChain* pol, PolyChain*& main)
这是因为您通过值传递指针
PolyChain*main
。可视化“按值传递”的一种简单方法是将其视为“按副本传递”:指针的副本专门用于调用AddChain
。这就是为什么对AddChain
中的指针所做的任何更改仍然是AddChain
的本地更改
您可以通过三种不同的方式解决此问题:
- 引用
这是最简单的解决方案。因为没有什么需要改变PolyChain*&main
- 通过指针获取
——在这种情况下PolyChain**main
需要引用AddChain
,即使用main
而不是*main
,并在将main
传递到main
时获取指针AddChain
- 返回
,新值为PolyChain*
-在这种情况下,调用者必须将结果分配回传递给main
的指针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);
注意:这种做法极易出错,因此您必须格外小心以这种方式管理指针。按值传递指针。想一想,如果我这样做了,我如何将多链传递给函数?使用PolyChain*我只需要&variable_name,但现在不行了fit@OfekT以同样的方式
AddChain(&pol,&main)
其中pol
和main
是PolyChain
类型的变量。它不是。PolyChain l=MakeChain(2,2,NULL);AddChain(&MakeChain(1,4,NULL),&l);给我一个错误,说它不是correct@OfekT你有没有试着去做,我贴的是什么?它肯定会起作用。我还注意到比make chain函数返回的值更大。你把它存放在哪里了?当我试图用&(&L))@Ofek.T传递PolyChain时,我遇到了常规类型的问题。编译器说了什么?它说-(&)表达式必须是左值或函数designator@OfekT你试过最后一个例子了吗?指针的地址(&*)可能会起作用,但这将迫使我在每次使用函数发送它,然后接收它时生成一个指针,变量对我来说毫无意义,只是代码使用中的额外工作
PolyChain* pMain = &main;
AddChain(&pol, &pMain);