c++传递指针作为参数.如何理解它

c++ pass pointer as parameter. How to understand it?

本文关键字:参数 何理解 指针 c++      更新时间:2023-10-16

我认为下面代码片段中的printList函数接收指针作为参数。因此,它将修改head指针。但实际上,它不是。否则,第二个printList函数根本无法打印节点,因为在第一个printList函数中,head指针已经移动到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;对调用方没有影响,因为headprintList函数来说是本地的。从这个意义上讲,传递指针与传递intdouble没有什么不同。您将获得传入对象的本地副本。不同之处在于指针允许您引用非局部对象。

参数ListNode* head接受指针副本。然后,head =只修改该副本,而不修改传递给函数的原始指针。

如果需要修改原始指针,传递一个引用给它:ListNode*& head

这样,您就从指针中获得了一个副本。
如果你想修改指针本身,你可以这样写。

void printlist(ListNode*& head)  

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