设为首页 加入收藏

TOP

C++地址传递
2017-03-30 14:17:14 】 浏览:332
Tags:地址 传递

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/C++训练(1)最大公约数与最小.. 下一篇C++重定义变量类型

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目