返回信息流背景:
Bnode://模板类
Object data;
函数:
test1(Bnode<int> *x){
x=new Bnode<int>;
x->data=30;
}
test2(Bnode<int> * &x){
x=new Bnode<int>;
x->data=30;
}
主函数
int main(void){
Bnode<int> * tmp1=nullptr;
Bnode<int> *tmp2=nullptr;
test1(tmp);
test2(tmp2);
}
问题:为什么tmp1结果依旧为nullptr而tmp2结果却已经改变?
这是一条镜像帖。来源:北邮人论坛 / cpp / #86815同步于 2015/4/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[问题]函数参数问题
zf1992
2015/4/23镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
首先,test1(tmp);都没有用到tmp1
然后,test1是传值调用,test2是传引用。传值调用不可以改变原值(但是可以改变指针之指向的内容)。
写顺手了,test1(tmp1)
【 在 libenchao 的大作中提到: 】
: 首先,test1(tmp);都没有用到tmp1
: 然后,test1是传值调用,test2是传引用。传值调用不可以改变原值(但是可以改变指针之指向的内容)。
这个主要涉及到函数调用时候是值传递还是引用传递,第一种方法就是值传递,说通俗一点就是tmp1直接把其内存中的地址拷贝给了x,这样x和tmp1现在其实都是指向了NULL这个地址所指向的内存空间,但是之后第一个函数里面new了一块内存出来让x指向它,但是tmp1还是没有变,仍然为NULL;第二个函数就不一样了,使用的是引用传递函数参数,这个时候x和tmp2是同一个变量,只是名字不一样而已,所以当在第二个函数里面new一块内存给x的时候,其实就是相当于给了tmp2,所以tmp2的值会改变。