今天终于打算来处理下这个问题了,至于为什么有的时候形参要使用二重指针,尤其是在建树以及建立单链表的时候。
我们知道,在建立树节点以及建立链表的节点的时候,一般的教材里面是这样写
(Node *)malloc(sizeof(Node))
这里我认为就是为什么要使用二重指针的原因
int BTreeCreate(BTree **tp)
{
//构造方法,或者说构造顺序:从左子树开始构造
int x;
scanf("%d",&x);
if(x<0)
{
*tp=NULL;//指针为空,树节点中的某个指针为空
return 0;
}
//++++++++++++++++++++++++++++//
*tp=(BTree*)malloc(sizeof(BTree));//将树节点中指针指向该地址空间
//++++++++++++++++++++++++++++//
if(tp==NULL)
return 0;
(*tp)->data=x;
BTreeCreate(&((*tp)->left));
BTreeCreate(&((*tp)->right));
return 1;
}
下面看下类似于它的讲解,参考链接
http://blog.chinaunix.net/uid-26983585-id-3219788.html
http://www.2cto.com/kf/201312/261723.html
//这里呢,传递了一个指针,此时,实参M和形参pt指向内存的同一块空间,都指向了null;
void get_Vale1(char *pt)
{
//正是因为这里又重新开辟了一块内存,此时呢,给形参pt的重新开辟了一块空间, 而实参M没有变化,还指向NULL;
//就是这里,M 和pt 已经没有联系了,彻底变成了两个指向不同的指针;
pt=(char *)malloc(strlen("sx_liang")+1);
strcpy(pt,"sx_liang");
//退出函数时,因为M是局部变量,在栈中分配的空间,那么M自动销毁,而在堆中为M分配的空间呢,泄露了,没有被释放;是个问题!
}
//这里呢,传递的是二级指针;此时,pt指向实参,而不是和实参M一样指向null;*pt此时才和M相同,都指向了NULL;注意体会一下;
void get_Vale2(char **pt)
{
//在这里呢,*pt就是实参M ,给*pt申请空间,就是在为实参M申请空间;注意体会了;
*pt=(char *)malloc(strlen("sx_liang")+1);
strcpy(*pt,"sx_liang");
//退出函数后,pt销毁,但是它申请的空间没被释放,但是该空间有M指向它,不担心释放问题;
}
int main()
{
char *M=NULL;
get_Vale1(M); //看看,这里调用的过程中,传递的是一级指针;
if( NULL==M) //额。。。。在这里呢,就会执行if 里边的信息了。。。
{
cout<<"Mis NULL"<<endl;
exit(1);
}
else
cout<<M<<endl;
get_Vale2(&M); //这里呢,传递的是二级指针,结果呢,就输出了“sx_liang";
if( NULL==M)
{
cout<<"M is NULL"<<endl;
}
else
cout<<M<<endl;