我一直在种树,因为种树会拯救地球(或只是节目)。
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将确定谁将获得批准答案的人。
答案 0 :(得分:4)
是的,它是一个副本并且它保存相同的地址,但是您只分配给该副本,该副本在函数返回时被丢弃。原件没有改变。那是你的问题。
顺便说一下,恕我直言,如果你要改变一个参数的值,你应该使用一个指针,因此指向你的情况下的指针。这使得读者更清楚地知道你正在改变价值。
答案 1 :(得分:2)
n = new node(value);
是一项任务。
指针获取一个新值。现在它指向其他地方。指针是按值传递的,因此调用代码不会看到任何变化 - 赋值只有局部效果。
答案 2 :(得分:2)
在insert_node
中,您正在更改n
指向的内容。
如果您希望在调用者中反映出来,那么您需要通过引用传递指针n
:void insert_private(int value, node*& n)
,尽管我更喜欢node** n
,因为它向调用方发出信号参数值可能的功能。
虽然root
是一个类成员,但您可以直接在insert_private
内修改它。
答案 3 :(得分:2)
但是如果一个指针保存一个地址,那么它的副本是否保持相同的地址?
当然,直到您更改副本中的地址。