什么是Node*&aNode?

And*_*ind 1 c++ linked-list

在以下代码中:

void insert(Node *& aNode, int x) {
  if (!aNode) {
    aNode = new Node(x);
    aNode->next = aNode;
    return;
  }

  Node *p = aNode;
  Node *prev = NULL;
  do {
    prev = p;
    p = p->next;
    if (x <= p->data && x >= prev->data) break;   // For case 1)
    if ((prev->data > p->data) && (x < p->data || x > prev->data)) break; // For case 2)
  } while (p != aNode);   // when back to starting point, then stop. For case 3)

  Node *newNode = new Node(x);
  newNode->next = p;
  prev->next = newNode;
}
Run Code Online (Sandbox Code Playgroud)

什么是Node*&aNode?

我应该如何使用此功能,我的意思是,我应该通过哪种类型的参数?

Rei*_*ica 10

我认为这段代码是C++,而不是C,并且Node *&aNode是对a的指针的引用Node,所以你要传递Node*给函数,函数会引用它(所以你Node*指向的内存位置可以改变).

您可能会发现有关References(C++)的维基百科文章很有趣.

一个简单的例子:

#include <iostream>
void addOneToValue(int num) {
    ++num;
}

void addOneToRef(int &num) {
   ++num;
}

int main() {
   int num = 0;

   // print 0
   std::cout << num << std::endl;

   // print 0 again (addOneToValue() has no effect)
   addOneToValue(num);
   std::cout << num << std::endl;

   // print 1 (addOneToRef() changes the value of num)
   addOneToRef(num);
   std::cout << num << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

@ crashmstr的评论提醒我,我应该说它们与指针有什么不同.维基百科做得更好,但我可以做到:

  • 定义后,无法直接引用参考对象; 任何出现的名称都直接引用它引用的对象.
  • 一旦创建了引用,就不能在以后引用另一个对象; 它不能重新安置.这通常用指针完成.
  • 引用不能为null,而指针可以; 每个引用都指某个对象,尽管它可能有效也可能无效.
  • 参考文献不能未初始化.由于无法重新初始化引用,因此必须在创建引用后立即初始化它们.特别是,必须在定义它们的地方初始化局部变量和全局变量,并且必须在类的构造函数的初始化列表中初始化作为类实例的数据成员的引用.
  • 大多数编译器都会支持空引用而没有太多抱怨,只有在尝试以某种方式使用引用时才会崩溃.

  • 在C中,你需要有`Node**aNode`(指向指针的指针),并且在你的代码中会有更多的*和&.在C++中引用指针可能不易出错 (2认同)