C++ c++;将指针作为参数传递。如何理解它?

C++ c++;将指针作为参数传递。如何理解它?,c++,C++,我认为下面代码段中的printList函数接收指针作为参数。因此,它将修改头指针。但事实并非如此。否则,第二个printList函数根本无法打印节点,因为head指针在第一个printList函数中已移动到NULL ListNode * head = new ListNode(-1); push(head, 5); push(head, 20); push(head, 4); push(head, 3); push(head, 30); printf("%x", head); printList

我认为下面代码段中的
printList
函数接收指针作为参数。因此,它将修改
指针。但事实并非如此。否则,第二个
printList
函数根本无法打印节点,因为
head
指针在第一个
printList
函数中已移动到
NULL

ListNode * head = new ListNode(-1);
push(head, 5);
push(head, 20);
push(head, 4);
push(head, 3);
push(head, 30);
printf("%x", head);
printList(head);
printf("%x", head);

void printList(ListNode  *head) {
    while (head != NULL) {
        printf("%d ", head->val);
        head = head->next;
    }
    printf("\n");
}

C++具有传递值语义。
head=head->next
对调用方没有影响,因为
head
printList
函数的本地项。从这个意义上讲,传递指针与传递
int
double
没有什么不同。您将获得传递对象的本地副本。不同之处在于指针允许您引用非本地对象。

这样,您就可以从指针获取副本。
如果你想修改指针本身,你可以这样写

void printlist(ListNode*& head)  

获取指针的目的是避免复制对象本身,当值可以为null ptr时,可以通过指针而不是引用获取指针。

参数
ListNode*head
获取指针的副本
head=
则只修改该副本,而不修改传递给函数的原始指针

ListNode * head = new ListNode(-1);
push(head, 5);
push(head, 20);
push(head, 4);
push(head, 3);
push(head, 30);
printf("%x", head);
printList(head);
printf("%x", head);

void printList(ListNode  *head) {
    while (head != NULL) {
        printf("%d ", head->val);
        head = head->next;
    }
    printf("\n");
}

如果需要修改原始指针,请传递对它的引用:
ListNode*&head

您传递的是在函数内部修改的指针,但其内容不是。尝试使用
ListNode*&head