#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); /* 構造右子樹 */ } }
对于(BiTree T)这样写:没问题,但这样会存在拷贝,一般自定义的类型不建议这样传递,因为拷贝造成效率降低,而且如果类型是“类”的话还会有赋值和拷贝构造的问题
对于(BiTree *T)这样写:没问题,推荐使用,常用于自定义的类型的传递,不发生拷贝,直接操作原对象,修改后返回也方便。
(BiTree *T)是in-out,(BiTree T)是in
用T也是可以的
不说具体场景,void CreateBiTree(BiTree *T)和void CreateBiTree(BiTree T)
第一个传递到方法内的是一个指针变量的地址,第二个传入的是结构体的地址,也就是指针的值.
就跟你上面说的,一个是指向结构体指针的指针,一个是指向结构体的指针,
分清传值和传地址,及了解引用的概念后,就迎刃而解。
用*T 可以说是为了“方便“,因为这样如果要返回节点的话就不用 return T 而是直接使用二级指针
int a = 123;
int *p = 0;
int **q = 0;
p = &a;
q = &p;
*p = 123;
**q = 123;