C++地址传递:对于二叉搜索树的插入函数书写。函数是一个递归函数,二话不说,先贴代码。
void AVLTree::insertNode(AVLNode* mroot, int item){//节点插入
if (mroot == 0){
mroot = new AVLNode(item);
}
else if (mroot->data > item){
mroot->balanceFlag++;
insertNode(mroot->left, item);
}
else if (mroot->data < item){
mroot->balanceFlag--;
insertNode(mroot->right, item);
}
else{
cout << "Item has already in the Tree" << endl;
}
}
在main函数的代码
avltree.insertNode(avltree.getRoot(), 1);
avltree.insertNode(avltree.getRoot(), 2);
avltree.insertNode(avltree.getRoot(), 3);
到最后alvtree.getRoot()依然是空的(前面初始化根节点为空)。
但是我这是指针传递啊,指针传递不是会改变实参的值吗?为什么运行到最后依然啥都没变?问了旁边的同学也觉得没毛病。
上网查找值传递、指针传递、引用传递的具体意思,的确别有洞天。
值传递:只是对值的传递,在被调函数中只是对参数的使用,并不改变实参的值。
指针传递:实质也是值传递,不过他传递的是实参的真实地址。故在绝大多数情况下都是可以改变实参的值。但是还有个例:
若被调函数中,这个指针地址发生改变,并不影响原实参的地址!所以说,为什么实质是值传递。若地址发生变化,实参任然是岿然不动的!上面的程序的毛病 就在此处。
if (mroot == 0){
mroot = new AVLNode(item);
}
这里,mroot被赋予一个新的地址空间,他的地址发生了变化。真正的root根节点其实依然没变化。
好了,继续把引用传递讲完。
引用传递:因为有实参存在,引用传递才可以引用实参。这时候在被调函数中传递的是主函数中实参的地址,这里的地址操作就是对实参的操作。值得注意的是,引用传递是依赖实参的存在而存在,不会单独个体存在。
最后,把代码问题解决了,按照书上所写(之前没有完全按照书上来写,本以为自己是正确的)。首先将AVLNode*重命名
typedef AVLNode* AVLPoint;
在递归函数中,这样声明
void AVLTree::insertNode(AVLPoint& mroot, int item){//节点插入
if (mroot == 0){
mroot = new AVLNode(item);
}
else if (mroot->data > item){
mroot->balanceFlag++;
insertNode(mroot->left, item);
}
else if (mroot->data < item){
mroot->balanceFlag--;
insertNode(mroot->right, item);
}
else{
cout << "Item has already in the Tree" << endl;
}
}
运用引用传递,解决问题。
对概念的不清楚才是问题的关键。之前一直将指针传递视为至高无上的存在,还是要认清指针概念
C++地址传递
发表于:2017-08-08
作者:网络转载
来源:
 相关文章
指针变量在C/C++中的内存占用 C++ Module详解:模块化编程终极指南 深入学习 C++编程,数据结构与算法关系 C++编程入门!五个学习阶段让你从新手... 掌握C/C++中的静态变量与静态成员! C++函数式编程:提高代码表达力和可维护性- 周排行
- 月排行
- 评论排行
-   高效IT:如何利用零代码开发平台快速...
-   生成式人工智能在软件开发过程现代化...
-   一体化好好的,为什么要前后端分离?
-   13种最佳App设计不止有设计美感,更跟...
-   12张图带你彻底理解分布式事务产生的...
-   2023 年 Java 发展趋势
-   Web3应和Web2一样用JavaScript构建
-   系统设计 | 应用、微服务、流程、规则编排
-   值得一试的五大AI编程助手
-   高效IT:如何利用零代码开发平台快速...
-   生成式人工智能在软件开发过程现代化...
-   一体化好好的,为什么要前后端分离?
-   衡量开发人员工作效率的五个技巧
-   2018年最全的App设计资源(工具+模板...
-   从软件出发,非功能测试思考总结
-   展望2017,谁是网络技术头牌?
-   C/C++单元测试工具Visual Unit 4 介绍
-   国内外最好用的6款Bug跟踪管理系统
-   性能测试指标评估必读
-   百度软件测试方案模板
-   38张史上最全的IT工程师技能图谱
-   C/C++单元测试工具Visual Unit 4 介绍
-   2019年,你会选哪些安全测试工具?
-   十款Web服务器性能压力测试工具
-   软件测试入门指南:周期、模型和文档化
-   记自动化测试成神学习之路
-   软件测试全景图 -最全的思维导图