向函数传递指针变量

C++: Passing pointer variable to function

本文关键字:指针 变量 函数      更新时间:2023-10-16

我有一个类Node:

class Node {
public:
    int item;
    Node * nextLink;
};

在函数外声明一个Node指针:

Node * newNode;

然后,把这个指针传递给函数foo:

void foo(Node * node) {
  node = new Node();
  node->item = 1;
  Node * anotherNode = new Node();
  anotherNode->item = 2;
  node->nextLink = anotherNode; 
}

实际调用:

foo(newNode);

在foo的末尾(但在存在之前),我可以看到node->item和node->nextLink指向正确的位置。然而,当从foo返回时,我检查newNode,项目是正确的,但nextLink不在那里。

有什么建议吗?由于

您需要传递一个引用。您正在修改指针

的副本。

void foo(Node*& node) 

foo()中,您正在修改传递给函数的指针的本地副本。将foo修改为:

void foo(Node ** node) {
  *node = new Node();
  (*node)->item = 1;
  Node * anotherNode = new Node();
  anotherNode->item = 2;
  (*node)->nextLink = anotherNode; 
}

则调用变为:

foo( &newNode );

你说发生的事我不太明白。因为你是按值传递指针变量,它在调用函数中的值根本不应该被改变,据我所知,所以你实际上不应该看到你的函数的任何结果。

虽然我无法解释当前代码中发生的细节,但我强烈建议您这样尝试:

Node * foo(void) {
  Node * node = new Node();
  node->item = 1;
  Node * anotherNode = new Node();
  anotherNode->item = 2;
  node->nextLink = anotherNode;
  return node;
}

和调用:

Node *newNode = foo();

由于你的函数实际上并没有对传入的指针值做任何事情,因此使用局部变量创建所有内容并返回指向新分配节点的指针更有意义。

(您也可以像其他人建议的那样传递对指针的引用,但我不认为这是在这种情况下良好的编程风格。简单地从函数返回指针并在调用代码中将其赋值给适当的变量会更清楚。

您有三个选择。你可以传递一个Node**作为输入,一个Node*&作为输入,或者您可以从foo方法返回Node*。

如果你想让函数foo改变指针,你必须用指针的地址来调用它,像这样:

Node * newNode;
void foo(Node ** nodepointer) {
    (*nodepointer) = new Node();
    (*nodepointer)->item = 1;
    Node * anotherNode = new Node();
    anotherNode->item = 2;
    anotherNode->nextLink = NULL;
    (*nodepointer)->nextLink = anotherNode; 
}
foo(&newNode);

如上所示,您还应该将anotherNode->nextLink设置为NULL以标记列表的结束。