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
。