首页新闻找找看学习计划

对于C/C++的指向指针的指针有点不明白。具体看程序能告诉我为什么要这样吗?

0
悬赏园豆:20 [已解决问题] 解决于 2014-09-05 09:04
#include <iostream>
using namespace std;

typedef int ElemType;
typedef struct BiTree_{
    ElemType data;
    struct BiTree_ *lchild;
    struct BiTree_ *rchild;
}BiTNode, *BiTree;

void InitTree(BiTree *T)//不明白这里为什么要用*T, 用T不行吗? 
{
    *T = new BiTNode;
    
    (*T)->data = NULL;
    (*T)->lchild = NULL;
    (*T)->rchild = NULL;
}

int main()
{
    BiTree tree;
    InitTree(&tree);
    
    return 0;
}

具体的程序比较长,我就只帖这一点吧,怕大神看着费劲不给解答。这段程序是我参考着一些书上写的,可能是错的,但是我看到很多的地方都用到了指向指针的指针,不是很明白。 

问题补充:

以下是我在维基百科里面粘的一段程序,也用到了指向指针的指针,不是很明白。能给我讲讲吗?

void CreateBiTree(BiTree *T)
 { /* 算法6.4:按先序次序輸入二叉樹中結點的值(可為字符型或整型,在主程中定義),*/
   /* 構造二叉鏈表表示的二叉樹T。變量Nil表示空(子)樹。有改動 */
   TElemType ch;
   scanf(form,&ch);
   if(ch==Nil) /**/
     *T=NULL;
   else
   {
     *T=(BiTree)malloc(sizeof(BiTNode)); /* 生成根結點 */
     if(!*T)
       exit(OVERFLOW);
     (*T)->data=ch;
     CreateBiTree(&(*T)->lchild); /* 構造左子樹 */
     CreateBiTree(&(*T)->rchild); /* 構造右子樹 */
   }
 }
ii沙漠的主页 ii沙漠 | 初学一级 | 园豆:114
提问于:2014-08-30 19:25
< >
分享
最佳答案
0

对于(BiTree T)这样写:没问题,但这样会存在拷贝,一般自定义的类型不建议这样传递,因为拷贝造成效率降低,而且如果类型是“类”的话还会有赋值和拷贝构造的问题

对于(BiTree *T)这样写:没问题,推荐使用,常用于自定义的类型的传递,不发生拷贝,直接操作原对象,修改后返回也方便。

(BiTree *T)是in-out,(BiTree T)是in

收获园豆:4
lgchr | 菜鸟二级 |园豆:206 | 2014-09-03 16:58
其他回答(4)
0

用T也是可以的

收获园豆:4
jello chen | 园豆:7037 (大侠五级) | 2014-08-30 20:08
0

不说具体场景,void CreateBiTree(BiTree *T)和void CreateBiTree(BiTree T)

第一个传递到方法内的是一个指针变量的地址,第二个传入的是结构体的地址,也就是指针的值.

就跟你上面说的,一个是指向结构体指针的指针,一个是指向结构体的指针,

收获园豆:4
吴瑞祥 | 园豆:28571 (高人七级) | 2014-08-30 22:59
0

分清传值和传地址,及了解引用的概念后,就迎刃而解。

收获园豆:4
LiuKaiFa | 园豆:1491 (小虾三级) | 2014-08-31 07:05
0

用*T 可以说是为了“方便“,因为这样如果要返回节点的话就不用 return T 而是直接使用二级指针

 int a = 123;
 int *p = 0;
 int **q = 0;
 p = &a;
 q = &p;

*p = 123;

**q = 123;

收获园豆:4
没用过剃须刀 | 园豆:208 (菜鸟二级) | 2014-09-02 13:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册