鱼C论坛

 找回密码
 立即注册
查看: 6431|回复: 16

二叉树的递归建立和遍历中的双指针的问题

[复制链接]
发表于 2015-8-25 12:18:02 | 显示全部楼层 |阅读模式
15鱼币
本帖最后由 骇客king 于 2015-8-25 16:58 编辑

GreateBiTree(BiTree T)
{
        char c;
        scanf("%c",&c);
        if(c==' ')
        {
                T=NULL;
        }
        else
        {
                T=(BiTree)malloc(sizeof(BiTrNode));
                T->data=c;
                GreateBiTree(T->lc);
                GreateBiTree(T->rc);

        }
}
红色的没有理解啊,为什么这样做不行,为什么要用到双重指针呢?
个人理解为是因为需要改变指针的内容,单指针就不能改变内容了吗?

typedef  char ElemType;
typedef struct BiTrNode
{
        ElemType data;
        struct BiTrNode *lc ,*rc;
} BiTrNode,*BiTree;
结构在这里

最佳答案

查看完整内容

一句话 想通过函数的参数 动态申请内存 要么传递二级指针 要么传递一级指针的引用(引用底层也是利用指针实现 一个道理) 你传递一个一级指针进去 参数自动拷贝了一个指针的临时变量 内部是代为为这个临时变量申请了内存 不过等函数体结束 临时变量消失 外部的指针并没有获得内存 并且还造成了内存泄露
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-25 12:18:03 | 显示全部楼层
一句话 想通过函数的参数 动态申请内存
要么传递二级指针 要么传递一级指针的引用(引用底层也是利用指针实现 一个道理)

你传递一个一级指针进去 参数自动拷贝了一个指针的临时变量 内部是代为为这个临时变量申请了内存 不过等函数体结束 临时变量消失 外部的指针并没有获得内存 并且还造成了内存泄露
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-25 18:43:12 | 显示全部楼层
lz你说的双重指针在哪?是T->lc吗
T->lc是单指针
双重指针是比如 int ** A;

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
骇客king + 5 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-8-26 09:50:56 | 显示全部楼层
本帖最后由 骇客king 于 2015-8-26 09:57 编辑
melttt 发表于 2015-8-25 18:43
lz你说的双重指针在哪?是T->lc吗
T->lc是单指针
双重指针是比如 int ** A;


是的,我用单指针不能达到预期的效果,只能用双重指针,单指针传入的值出函数后,就没用了,只能用指针的指针来改变指针的值,达到函数外指向的目的。

关键点在于,要想改变函数外的指针指向的内容,需要用到双重指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-26 10:02:50 | 显示全部楼层
http://bbs.fishc.com/thread-61532-1-1.html

这是之前给别人解答的一个例子 楼主你看下
都是一个类型的 关于动态传递内存的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-8-26 10:27:22 | 显示全部楼层
ryxcaixia 发表于 2015-8-25 12:18
一句话 想通过函数的参数 动态申请内存
要么传递二级指针 要么传递一级指针的引用(引用底层也是利用指针 ...

我应该理解了,就是说跟最开始学指针式一个意思了
int a=5,b=6;
int *p1=&a,*p2=&b;
要想在其他函数体里边改变a和b值,那么传进去的就得是a和b的地址,然后在函数体里*a取内容去改变他的内容,现在这个也是传进去一个地址,不过这个地址的内容是指针,所以需要接收的就是指针的指针,然后在函数里去,*传来的地址,这个就是函数体外要改变的内容了,我这么理解对吧,麻烦帮忙看看,写的有点乱,是按一步一步想出来的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-26 11:03:20 | 显示全部楼层
骇客king 发表于 2015-8-26 10:27
我应该理解了,就是说跟最开始学指针式一个意思了
int a=5,b=6;
int *p1=&a,*p2=&b;

正解! 就是这个意思

对于指针 如果不传递二级指针或者指针的引用 那么申请到的地址 仅仅是给了临时变量 随着函数结束 临时变量消失 原来的指针并没有获得内存

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-26 11:05:49 | 显示全部楼层
简单来说
// 这是个错误例子
void GetMemory(int * p)
{
    p = (int*)malloc(sizeof(int) * 10);
}

// 正确写法如下
void GetMemory(int** p) // p是指针胡地址
{
    *p = (int*)malloc(sizeof(int) * 10); // *p就是外部指针变量的真实地址
}

// 或者是
void GetMemory(int*& p)
{
    p = (int*)malloc(sizeof(int) * 10);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-8-26 11:15:01 | 显示全部楼层
ryxcaixia 发表于 2015-8-26 11:05
简单来说
// 这是个错误例子
void GetMemory(int * p)

多谢,多谢,终于理解了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-16 21:55:37 | 显示全部楼层
还差3个鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-23 21:34:32 | 显示全部楼层
我是来领鱼币的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-25 19:55:19 | 显示全部楼层
领鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-25 20:19:35 | 显示全部楼层
领鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-25 20:20:16 | 显示全部楼层
领鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-25 20:44:20 | 显示全部楼层
领鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-25 20:58:18 | 显示全部楼层
领鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2016-2-28 14:00:07 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 01:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表