c++ - 澄清通过引用传递指针

标签 c++ pointers linked-list

这有点傻,但我真的无法解释为什么会这样。作为练习,我想反转一个单链表,我通过定义方法来做到这一点:

class solution {
    void reverseLinkedList(Node*& head) {
      Node* curr = head;
      Node* prev = NULL;
      while (curr != NULL) {
        Node* _next = curr->next;
        curr->next = prev;
        prev = curr;
        curr = _next;
      }
      head = prev;
}

在我的主要功能中,我进行调用

solution s;
s.reverseLinkedList(head);

Node* iterator = head;
while (iterator != NULL) {
    std::cout<<iterator->data<<std::endl;
    iterator = iterator->next;
}

我之前在其中定义了指向某个链表的头指针。 while 循环用于打印我的链表,函数完成它的工作。这仅在我通过引用传递头节点后才起作用;我最初尝试在开始时传递 Node* head 而不是 Node*& head ,它只打印了我的链表的第一个元素(并且没有反转它)。例如,如果我没有通过引用传递列表 1->2->3,我将只打印出 1。

我以为传递一个指针就足够了?为什么我没有通过引用传递就得到了这种奇怪的行为>

最佳答案

C++ 中的局部变量(存储在堆栈中)具有 block 范围,即它们在执行定义它们的 block 后超出范围。

当您将指针传递给函数时,会创建该指针的拷贝,并且该拷贝就是传递的内容。执行函数后,函数工作区中的变量将超出范围。在函数内创建的任何非静态自动变量都将被销毁。

当您通过引用传递时,您不会传递变量的拷贝,而是传递实际变量,因此对变量所做的任何更改都会反射(reflect)在传递给函数的实际变量上(通过引用)。

我想指出的是,指向下一个节点的指针存储在内存中,并且有一个指向它存储位置的地址。所以如果你不想通过引用传递,你可以这样做:

  1. 使用指向指针的指针,该指针指向存储指向下一个节点的指针变量(地址)的内存位置
  2. 将其传递给函数(不是通过引用)
  3. 取消引用指针并存储您要指向的新地址。

我知道这有点令人困惑,但请查看这段将节点添加到链表的小代码。

void addNode(Node** head, int newData)
{
    Node* newNode = new Node;
    newNode->data = newData; // Can also be done using (*newNode).data
    newNode->next = *head;
    *head = newNode;
}

关于c++ - 澄清通过引用传递指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50478061/

相关文章:

c - 二进制文件写入问题

java - 在双向链表中创建自己的删除方法

c++ - 没有可调用的匹配函数

Python C++ 绑定(bind)类型向上转换问题

c++ - 删除指针后将其设为 NULL 是一个好习惯吗?

c++ - 将指向类方法的指针作为函数参数传递

c++ - 别名到数组

c++ - std::string 与模板一起使用,检查是否为空

c - 为什么我的 File.dat 不会被读取和运行,我如何将数据分配给结构? - C

c++ - 如何在链表类中实现赋值运算符