C++ 指针如何在C++;

C++ 指针如何在C++;,c++,pointers,recursion,C++,Pointers,Recursion,我有以下功能来反转链接列表: Node* reverseUtil(Node *head, Node *prev) { if (head->next == NULL) { head->next = prev; return head; } Node *next = head->next; head->next = prev; prev = head; head = next; retur

我有以下功能来反转链接列表:

Node* reverseUtil(Node *head, Node *prev) {
    if (head->next == NULL) {
        head->next = prev;
        return head;
    }
    Node *next = head->next;
    head->next = prev;
    prev = head;
    head = next;
    return reverseUtil(head, prev);
}
当我用Node*head=reverseUtil(head,NULL)调用它时它工作正常,最终返回反向链表的头。例如,对于1->2->3,它返回带有3->2->1的head

但是,当我将其修改为以下内容时,结果头指针只有反向链接列表的最后一个节点(最初是列表的起点。例如:对于原始列表1->2->3,末尾的头只有1

void reverseUtil(Node *head, Node *prev) {
    if (head->next == NULL) {
        head->next = prev;
        return;
    }
    Node *next = head->next;
    head->next = prev;
    prev = head;
    head = next; //head pointer should update here on forward path. This seems to be happening.
    reverseUtil(head, prev);//after this step returns, head should stick to the last updated point and should return unchanged but this does not happen.
}

我想我缺少了一些基本的东西。我希望每次调用函数时的语句
head=next
都会更新head指针。它最终应该指向反向链表的新开头,并且应该在递归调用返回时保持不变。然而,它似乎在不断更新当你传递一个指向函数void foo(type*bar)的指针时,

指针包含的地址是通过值传递的。如果你需要更改地址,那么你需要通过引用传递它,比如
void foo(type*&bar)
。我想你会被这样的事实弄糊涂了

void foo(int * bar) { *bar = 10; }

int man() 
{
    int x = 5;
    foo(&x);
    // x is now 10 here
}
这里,我们不是在更改指针指向的对象,而是在更改指向对象的值。我们可以看到,在不通过引用传递时,更改指针地址不会产生任何影响:

void foo(int * bar)
{
    int foobar = 10;
    bar = &foobar;
}

int main()
{
    int x = 5;
    foo(&x);
    std::cout << x;
}
void foo(int*bar)
{
int foobar=10;
bar=&foobar;
}
int main()
{
int x=5;
foo&x;

std::如果不想返回指针,是否需要通过引用传递它。很抱歉,这是为什么。指针不应该得到动态更新并保持不变吗?提供像
Node*&head,
这样的引用应该可以解决您的问题。您实际上是在更新调用代码中未看到的副本。“我希望每次调用函数时的语句
head=next
都会更新head指针。”它更新
head
参数,该参数可能不是您正在考虑的“head指针”。您可以返回一个指针,或使用两个星(或一个星和一个typedef).一颗星本身是行不通的.谢谢.我想这说明了一点.实际上我对此感到困惑。