马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
我在学习小甲鱼的数据结构的二叉树一节时,对下面的代码有点疑惑,求路过的大佬们解惑!!
在这这里定义了结构体指针BiTree://定义一个树的结点
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
然后在这里用它定义T的时候,不明白为什么要在T的前面加个*,这样的话T就是个二重指针,这样做有什么好处吗,或者为什么不直接用T//默认使用前序遍历
void CreateTree(BiTree *T)
{
char c;
scanf("%c",&c);
if( ' ' == c)
{
*T = NULL;
}
else
{
*T = (BiTNode *)malloc(sizeof(BiTNode));
(*T)->data = c;
CreateTree(&(*T)->lchild);
CreateTree(&(*T)->rchild);
}
}
谢谢!!!!
不不不,你的理解已经颠覆了我。
是这样的,BiTree是代表结构体类型的指针,就像int是整型类型一样,只是int是库里面写好的,BiTree是你自己写的,BiTree本身是没指向的,就是个类型。BiTree T才是指针,T为指针, 指向的东西是BiTree这中结构类型的。BiTree *T那就是二重指针,前面说了不加“*”已经是指针了,要是再加上“*”就是指针的指针,作用当然也就是指向指向BiTree这个类型的指针的指针,要是这么说你觉得看不明白,我举个例子,首先BiTree T,然后我再声明一个BiTree *P = &T,那么P就是指向T,P存放就是T这个指针的地址,那么P的意义是什么那,就是改变T这个地址的值(这里补充一个知识点:T指向的东西的地址会存放在T的地址的值里),那么T就会被迫的指向别的地方。比如,T指向a,我现在让*P = &b(这里的a,b都是常数),前面说了*P = T(你不会要问为什么前面*P = &T,这里就变了?因为前面是声明+定义,要是分开,单纯的初始化P,就是先声明:BiTree *P,再定义P = &T。也就是说声明的*代表指针,定义要是写个*就代表解引用,这个应该知道吧?),那么是不是可以 T = &b,间接的强迫T指向到了b。
就是这个意思,所以二重指针就是为了让指针强迫的接受改变指向。
好了,你先看着,不懂点“回复”,不然我收不到消息。懂了点下“最佳答案”
|