关于指针的引用

时间:2015-07-14 13:30:36

标签: c++ pointers reference

我一直在种树,因为种树会拯救地球(或只是节目)。

class Tree {
  Node* root;
  // ...
  void insert(int value){
    private_insert(value, root);
  }
  void insert_private(int value, node* n){
    if(n == nullptr){
      n = new node(value);
    } else {
      your standard recursive insertion function here
    }
  }
  // ...
};

长话短说我先尝试过使用shared_ptrs,但insert()函数永远不会在我的树中添加任何元素。我以为我可能会对共享做错了所以我尝试了原始指针,并且我得到了相同的非插入式resoults。

原来我需要传递一个引用我的root / nodes。

void insert_private(int value, node*& n) {...};

据我所知,如果我不传递某些内容作为参考,那么就会制作副本。但是如果一个指针持有一个地址,它的副本是否保持相同的地址?如果我为一个非引用的指针创建一个new(),为什么它不会粘在我的根/节点上?

为什么我的问题在这里,我可以接受它,它的工作原理是这样的,我的树可以工作,但我不知道为什么会这样。

编辑:阅读评论后,我创建了这个小专家级程序:

void fn(int* i){
  cout << "Address of local in fn before change: " << i << endl;
  i = new int(2);
// so basically here we made a new int, and i will get the address of 
// this integer and will point to there, what we passed on before 
// becomes irrelevant
  cout << "Address of local in fn after change: " << i << endl;
}
void fn2(int **i){
  cout << "Address of local in fn2 before change: " << i << endl;
  *i = new int(2);
  cout << "Address of local in fn2 after change: " << i << endl;
}
int main(){
  int* p = nullptr;
  cout << "Address of p: " << p << endl;
  fn(p);
  cout << "p& is: " << &p << endl;
  fn2(&p);

  cin.get();
  return 0;
};

谢谢大家,对于答案,它帮助了很多。 random.org将确定谁将获得批准答案的人。

4 个答案:

答案 0 :(得分:4)

是的,它是一个副本并且它保存相同的地址,但是您只分配给该副本,该副本在函数返回时被丢弃。原件没有改变。那是你的问题。

顺便说一下,恕我直言,如果你要改变一个参数的值,你应该使用一个指针,因此指向你的情况下的指针。这使得读者更清楚地知道你正在改变价值。

答案 1 :(得分:2)

n = new node(value);是一项任务。

指针获取一个新值。现在它指向其他地方。指针是按值传递的,因此调用代码不会看到任何变化 - 赋值只有局部效果。

答案 2 :(得分:2)

insert_node中,您正在更改n指向的内容。

如果您希望在调用者中反映出来,那么您需要通过引用传递指针nvoid insert_private(int value, node*& n),尽管我更喜欢node** n,因为它向调用方发出信号参数值可能的功能。

虽然root是一个类成员,但您可以直接在insert_private内修改它。

答案 3 :(得分:2)

  

但是如果一个指针保存一个地址,那么它的副本是否保持相同的地址?

当然,直到您更改副本中的地址。