二叉树的递归建立和遍历中的双指针的问题
本帖最后由 骇客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);
}
}
红色的没有理解啊,为什么这样做不行,为什么要用到双重指针呢?
个人理解为是因为需要改变指针的内容,单指针就不能改变内容了吗?
typedefchar ElemType;
typedef struct BiTrNode
{
ElemType data;
struct BiTrNode *lc ,*rc;
} BiTrNode,*BiTree;
结构在这里 一句话 想通过函数的参数 动态申请内存
要么传递二级指针 要么传递一级指针的引用(引用底层也是利用指针实现 一个道理)
你传递一个一级指针进去 参数自动拷贝了一个指针的临时变量 内部是代为为这个临时变量申请了内存 不过等函数体结束 临时变量消失 外部的指针并没有获得内存 并且还造成了内存泄露 lz你说的双重指针在哪?是T->lc吗
T->lc是单指针
双重指针是比如 int ** A; 本帖最后由 骇客king 于 2015-8-26 09:57 编辑
melttt 发表于 2015-8-25 18:43
lz你说的双重指针在哪?是T->lc吗
T->lc是单指针
双重指针是比如 int ** A;
是的,我用单指针不能达到预期的效果,只能用双重指针,单指针传入的值出函数后,就没用了,只能用指针的指针来改变指针的值,达到函数外指向的目的。
关键点在于,要想改变函数外的指针指向的内容,需要用到双重指针 http://bbs.fishc.com/thread-61532-1-1.html
这是之前给别人解答的一个例子 楼主你看下
都是一个类型的 关于动态传递内存的问题 ryxcaixia 发表于 2015-8-25 12:18
一句话 想通过函数的参数 动态申请内存
要么传递二级指针 要么传递一级指针的引用(引用底层也是利用指针 ...
我应该理解了,就是说跟最开始学指针式一个意思了
int a=5,b=6;
int *p1=&a,*p2=&b;
要想在其他函数体里边改变a和b值,那么传进去的就得是a和b的地址,然后在函数体里*a取内容去改变他的内容,现在这个也是传进去一个地址,不过这个地址的内容是指针,所以需要接收的就是指针的指针,然后在函数里去,*传来的地址,这个就是函数体外要改变的内容了,我这么理解对吧,麻烦帮忙看看,写的有点乱,是按一步一步想出来的。 骇客king 发表于 2015-8-26 10:27
我应该理解了,就是说跟最开始学指针式一个意思了
int a=5,b=6;
int *p1=&a,*p2=&b;
正解! 就是这个意思
对于指针 如果不传递二级指针或者指针的引用 那么申请到的地址 仅仅是给了临时变量 随着函数结束 临时变量消失 原来的指针并没有获得内存
简单来说
// 这是个错误例子
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);
}
ryxcaixia 发表于 2015-8-26 11:05
简单来说
// 这是个错误例子
void GetMemory(int * p)
多谢,多谢,终于理解了~ 还差3个鱼币 我是来领鱼币的 领鱼币 领鱼币 领鱼币 领鱼币 领鱼币
页:
[1]