为什么一定要使用二级指针,而一级为什么就不行呢??

为什么一定要使用二级指针,而一级为什么就不行呢??

不是说函数中传递指针,在函数中改变指针的值,就是在改变 实参中的数据信息嘛???

额。。。其实吧,上边说的也对,可问题就在这块了。。。问题是,在建立二叉树的过程中,不是改变了形参的值,而是: 改变了形参的指向;而推出该函数后,形参被释放了,那么为形参动态分配的空间,也就没办法释放了,造成了内存泄露问题。。

举个例子吧:

  1. void get_Vale1(char *pt)
  2.  
  3. {
  4.  
  5.        pt=(char *)malloc(strlen("sx_liang")+1);
  6.  
  7.         strcpy(pt,"sx_liang");
  8.  
  9. }
  10.  
  11. void get_Vale2(char **pt)
  12.  
  13.  
  14. {
  15.  
  16.        *pt=(char *)malloc(strlen("sx_liang")+1);
  17.  
  18.         strcpy(*pt,"sx_liang");
  19.  
  20. }
  21.  
  22.  
  23.  
  24. int main()
  25.  
  26. {
  27.  
  28.          char *pt=NULL;
  29.  
  30.    
  31.  
  32.          get_Vale1(pt); //看看,这里调用的过程中,传递的是一级指针;
  33.  
  34.            if( NULL==pt) //额。。。。在这里呢,就会执行if 里边的信息了。。。
  35.  
  36.           {
  37.  
  38.                        cout<<"pt is NULL"<<endl;
  39.  
  40.                        exit(1);
  41.  
  42.           }
  43.  
  44.            else
  45.  
  46.                 cout<<pt<<endl;
  47.  
  48.                 get_Vale2(&pt); //这里呢,传递的是二级指针,结果呢,就输出了“sx_liang";
  49.  
  50.          if( NULL==pt)
  51.  
  52.           {
  53.  
  54.                        cout<<"pt is NULL

什么原因呢: 咱开始分析一下:

void get_Vale1(char *M)//这里呢,传递了一个指针,此时,M和 实参 pt 的指向内存的同一块空间,都指向了null;

M=(char *)malloc(strlen("sx_liang")+1); //此时呢,给M的重新开辟了一块空间, 而实参pt 没有变化,还指向NULL;

//就是这里,M 和pt 已经没有联系了,彻底变成了两个指向不同的指针;

strcpy(M,"sx_liang");//退出函数时,因为M是局部变量,在栈中分配的空间,那么M自动销毁,而在堆中为M分配的空间呢,泄露了,没有被释放;是个问题!

void get_Vale2(char **M)//这里呢,传递的是二级指针;此时,M 指向实参,而不是和实参一样指向null;*M 此时才和pt相同,都指向了NULL;注意体会一下;

*M=(char *)malloc(strlen("sx_liang")+1);//在这里呢,*M就是 实参pt ,给*M申请空间,就是在为pt 申请空间;注意体会了;

strcpy(*M,"sx_liang");//推出函数后,M销毁,但是它申请的空间没被释放,但是该空间有pt 指向它,不担心释放问题;

 

 

 

额。。。到这里了,应该就能明白为什么 二叉树的创建过程中 A 办法要使用二级指针了吧。。。。一级指针,每次创建的节点,都没有和头指针root 联系起来,当然就没办法打印了, 而二级呢。。。呵呵。。。就OK了。。。。

 

就是这样了。。。呵呵。。。

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值