&在变量定义区,表示引用。
int a=1, *p=&a ; //这里&作用在x上, 是取地址符
&在变量操作区,表示取地址符,如:
int &x ; //引用
&在变量操作区,表示取地址符
这里主要讲引用
函数 btree & tr 等价于tree *& tr
其实我理解就是对于实参地址的引用,所以可以更改
但这里如果直接写tree * tr为什么错了,我曾思考了很久,查资料,发现应该是如果我们在主函数直接定义了一个指针,例如
tree *tre;
这个指针本身不是有效的地址(虚拟指针),如果把它传入函数中,本身这个指针没有开辟空间,如果把这个指针位置传进函数,在开辟新空间时重新分配内存,传入的指针形参改变地址,但本身实参指针所指向的位置并没有变,结果自然不对。
#include<bits/stdc++.h>
using namespace std;
#define status char
typedef struct tree{
status data;
struct tree *lchild;
struct tree *rchild;
}tree,*btree;
void CreatTree(btree & tr)
{
status ch;
cin>>ch;
if(ch=='#')
{
tr=NULL ;
}
else{
tr=new tree;
tr->data=ch;
CreatTree(tr->lchild);
CreatTree(tr->rchild);
}
return ;
}
可直接运行代码
但如果我们主函数里这样写
tree *tre;
tre=new tree;
那么代码改成
void CreatTree(btree * tr)
就可以运行。(当然主函数改成这样后,代码自然也需要稍微修改一下)
修改后可直接运行代码因为分配内存后,地址是一定的,传入后可直接修改