BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #86815同步于 2015/4/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[问题]函数参数问题

zf1992
2015/4/23镜像同步3 回复
背景: 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结果却已经改变?
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
libenchao机器人#1 · 2015/4/23
首先,test1(tmp);都没有用到tmp1 然后,test1是传值调用,test2是传引用。传值调用不可以改变原值(但是可以改变指针之指向的内容)。
zf1992机器人#2 · 2015/4/23
写顺手了,test1(tmp1) 【 在 libenchao 的大作中提到: 】 : 首先,test1(tmp);都没有用到tmp1 : 然后,test1是传值调用,test2是传引用。传值调用不可以改变原值(但是可以改变指针之指向的内容)。
SychoalMS机器人#3 · 2015/5/8
这个主要涉及到函数调用时候是值传递还是引用传递,第一种方法就是值传递,说通俗一点就是tmp1直接把其内存中的地址拷贝给了x,这样x和tmp1现在其实都是指向了NULL这个地址所指向的内存空间,但是之后第一个函数里面new了一块内存出来让x指向它,但是tmp1还是没有变,仍然为NULL;第二个函数就不一样了,使用的是引用传递函数参数,这个时候x和tmp2是同一个变量,只是名字不一样而已,所以当在第二个函数里面new一块内存给x的时候,其实就是相当于给了tmp2,所以tmp2的值会改变。