游啊游 发表于 2016-5-7 10:57:39

关于指针引用的问题

//创建一棵二叉树 输入结点时采用前序遍历的顺序

void BiTree::Creat_BiTree(BiNode*&n)
{
    char temp;
    cin>>temp;
    if('#'==temp)
    {
      n=NULL;
    }
    else
    {
      n=new BiNode;
      n->data=temp;
      Creat_BiTree(n->lchild);
      Creat_BiTree(n->rchild);
    }
}

传参时为什么用的是指针的引用?不用引用可不可以?求详解

游啊游 发表于 2016-5-7 11:07:04

BiNode的定义:

游啊游 发表于 2016-5-7 11:08:50

struct BiNode{char data;BiNode *lchild,*rchild;};

rowang 发表于 2016-5-7 12:41:30

本帖最后由 rowang 于 2016-5-7 12:43 编辑

就这一段代码所要实现的功能来看,还是需要使用引用的。

为什么呢?在这儿,BiNode的指针类型 即代表了一棵树,而这个函数是建树的过程,也就是我们要修改说这棵树的内容,所以自然要用引用,否则就是在修改局部变量而对传入的树毫无影响。

或许可以采用更清楚一些的写法来解释:
typedef BiNode* Tree;

void Create_BiTree(Tree &T){ // 在本程序中,如果这里不加引用,main函数中的myTree无法成功建起来。
    // pass;
}

int main(){
    Tree myTree;
    Create_BiTree(myTree);
    return 0;
}


PS:贴代码时请使用代码格式

游啊游 发表于 2016-5-7 13:34:47

rowang 发表于 2016-5-7 12:41
就这一段代码所要实现的功能来看,还是需要使用引用的。

为什么呢?在这儿,BiNode的指针类型 即代表了 ...

我明白了,我刚开始没把值传递和址传递理解清楚,值传递不能改变原值

rowang 发表于 2016-5-7 14:23:44

游啊游 发表于 2016-5-7 13:34
我明白了,我刚开始没把值传递和址传递理解清楚,值传递不能改变原值

也许这种写法叫 引用传递 更恰当?我觉得说起地址传递是这样子吧:
void Create_BiTree(Tree *T){
    // pass;
}

游啊游 发表于 2016-5-7 21:11:42

嗯嗯
页: [1]
查看完整版本: 关于指针引用的问题