如何在c ++中取消引用通过引用传递的指针?

时间:2009-10-07 22:53:32

标签: c++ reference pointers dereference

我正在做这样的事情:

void insert(Node*& node, string val, Node* parent)
{
   if (node == NULL)
     instantiateNode(node, val, parent);
   else
     insert(node->child, val, node);
}

问题是,instantiateNode(..., parent)似乎修改了设置*&node时传入函数的原始*parentinstantiateNode()假设来改变node,但是如果它改变parent而不是你有一个设置为其父节点的节点,那么感觉,也不起作用。完全没有。

我厌倦了指针引用的原因是因为它消除了特殊情况并显着减少了我必须做的错误检查。由于我这样做是为了减少行数和简单的算法复制,我可以通过大约加倍代码行计数来解决这个问题。但我宁愿不这样做,我觉得应该是一种取消引用指针引用以获取指向同一对象的新指针的方法。而且,实际上,我认为*&node*parent的传递应该已经完成​​了,但显然gcc正在优化它。

3 个答案:

答案 0 :(得分:4)

  

应该有一种方法来取消引用指针引用以获取指向同一对象的新指针。

那么,这个怎么样?

Node* n = node;

现在你有一个非引用指针指向与节点相同的对象,正是你所要求的。

我95%肯定你所面临的问题与引用无关,而且与instantiateNode中的错误逻辑或你使用它有关。这就是为什么如果您向我们提供有关代码应该执行的操作的更多信息,或者甚至将代码发布到instantiateNode,这将是有用的。

答案 1 :(得分:3)

node是对指针的引用,这意味着如果函数设置了node,则传入的值会发生变化。这就是参考工作的方式。

如果您不想在调用函数中更改节点,请不要将其作为参考。

或者我误解了什么?

答案 2 :(得分:0)

我认为node不需要通过引用传递。一个简单的指针应该完成这项工作。这是因为您不需要直接更改它。你为什么把它传递给instantiateNode()?它总是为NULL,所以有什么好处呢?如果instantiateNode()也将其第一个参数作为参考传递,为什么?您传递的是父级,因此instantiateNode()只能通过node访问parent->child代表的内容。即使由于某种原因,instantiateNode()确实通过引用取得了它的参数,并且需要这样做,我相信如果从insert()的第一个参数中删除引用,该函数仍然可以工作。当函数返回时,instantiateNode()对该值的任何操作都将丢失。对不起,我感到很困惑,但我想不出更好的说法。

您的问题还有另一种解释......也许您对insert()的致电应该是:

insert(node, val, node->child);