关于建树以及建单链表时要使用二重指针的原因

来源:互联网 发布:修改屏幕分辨率软件 编辑:程序博客网 时间:2024/06/05 02:56

今天终于打算来处理下这个问题了,至于为什么有的时候形参要使用二重指针,尤其是在建树以及建立单链表的时候。
我们知道,在建立树节点以及建立链表的节点的时候,一般的教材里面是这样写
(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;
0 0
原创粉丝点击