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).一颗星本身是行不通的.谢谢.我想这说明了一点.实际上我对此感到困惑。