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

本文探讨了在构建树节点和单链表节点时使用二重指针的原因。通常,教材中使用 `(Node *)malloc(sizeof(Node))` 来创建节点,这正是使用二重指针的背景。通过引用外部链接提供的资源,文章解释了这一做法的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值