我有一个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不存在。
有什么建议吗? 感谢
答案 0 :(得分:5)
您需要传递参考。您正在修改指针的副本
试
void foo(Node*& node)
答案 1 :(得分:4)
在foo()
内,您正在修改传递给函数的指针的本地副本。将foo
更改为以下内容:
void foo(Node ** node) {
*node = new Node();
(*node)->item = 1;
Node * anotherNode = new Node();
anotherNode->item = 2;
(*node)->nextLink = anotherNode;
}
然后呼叫变为:
foo( &newNode );
答案 2 :(得分:3)
你所说的话对我来说并不合理。由于你是按值传递指针变量,所以根据我的意见,调用函数中的值根本不应该改变,所以你实际上不应该看到函数的任何结果。
虽然我无法解释当前代码中发生的事情的详细信息,但我强烈建议您这样尝试:
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();
由于您的函数实际上并没有对传入的指针值执行任何操作,因此使用局部变量创建所有内容并返回指向新分配节点的指针更有意义。
(您也可以像其他人建议的那样传递对指针的引用,但在这种情况下我不认为这是一种好的编程风格。只需从函数返回指针并将其指定给适当的指针就更清楚了。调用代码中的变量。)
答案 3 :(得分:2)
你有三个选择。您可以传递Node **作为输入,Node *&作为输入,或者您可以从foo方法返回Node *。这三个选项都有效。
答案 4 :(得分:2)
如果您希望函数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
以标记列表的结尾。