Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针赢了';别再回头了';返回(保持空)C++;_C++_Function_Pointers_Return - Fatal编程技术网

C++ 指针赢了';别再回头了';返回(保持空)C++;

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

我用我自己用stuct制作的链表。该结构有2个int和1个指向另一个结构next的指针

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

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