• 高级指针和引用,对于参数传递和赋值目标指针的意义


    事情起因:二叉树根节点在函数里赋值,怎么都赋不上。

    目录

    错误一

    错误二

    回到树上

    改正:

    高级指针

    引用


    错误一

    错误:指针p是通过按值传递到函数中的,所以申请空间并赋值的只是 p 的副本 temp。

    错误示例

     void f(int* temp)
     {
         temp = (int*)malloc(sizeof(4));
         *temp = 4;
     }
     int main(void)
     {
         int* p = NULL;
         f(p);
         if(p==NULL) printf("p is NULL");
     }

    输出为“p is NULL” 而为预想中的 4

    解决:按地址传递/按引用传递 —— 参数上做文章

    1. 高级指针

      实参取地址,形参作为高级指针。

       void f(int** temp)  //here
       {
           *temp = (int*)malloc(sizeof(int));
           **temp = 4;
       }
       int main(void)
       {
           int* p = NULL;
           f(&p); //here
           if(p==NULL) printf("p is NULL");
           else printf("%d",*p);
       }

    2. 引用

       void f(int* & temp)  //here
       {
           temp = (int*)malloc(sizeof(int));
           *temp = 4;
       }
       int main(void)
       {
           int* p = NULL; 
           f(p); //here
           if(p==NULL) printf("p is NULL");
           else printf("%d",*p);
       }

    错误二

    错误:平级指针对目标指针进行赋值。

    错误示例

     int* p1 = NULL;
     int* p2 = p1;
     p2 = (int*)malloc(sizeof(int));
     *p2 = 3;
     ​
     if(p1==NULL) printf("p is NULL");
     else printf("%d",*p1);

    输出为 “p is NULL” 而非预想中的3

    解决:

    1. 高级指针 指向 目标指针

       int* p1 = NULL;
       int** p2 = &p1;
       *p2 = (int*)malloc(sizeof(int));
       **p2 = 3;
       ​
       if(p1==NULL) printf("p is NULL");
       else printf("%d",*p1);

      输出为3

    2. 指针类型引用 指向 目标指针

       int* p1 = NULL;
       int*& p2 = p1;
       p2 = (int*)malloc(sizeof(int));
       *p2 = 3;
       ​
       if(p1==NULL) printf("p is NULL");
       else printf("%d",*p1);

      输出为3


    回到树上

    错误例子:

     typedef struct ABCD
     {
         char data;
         struct ABCD* lchild;
         struct ABCD* rchild;
     } treenode;
     void layer_create(treenode* root,deque& q)
     {
         q.push_front(root);
         while(!q.empty())
         {
             treenode* new_node = q.front();//111
             char data;
             cin>>data;
             if(data=='#'){
                 new_node = NULL;
             }
             else {
                 new_node = new treenode;//111
                 new_node->data = data;
                 q.push_back(new_node->lchild);
                 q.push_back(new_node->rchild);
             }
             q.pop_front();
         }
     }
     ​
     void test()
     {
         layer_create(root,q);
     }

    两处错误:

    1. root按值传递(指针也不行,因为指针和数据是绑定的,而非充当地址作用

    2. 平级指针对目标指针进行赋值。

    对于平级指针赋值错误:

     //参数:  deque& q;
     treenode* new_node = q.front();//1
     ​
     new_node = new treenode;//2

    这里我的想法:

    • 步骤一 :通过new_node来改变 deque 里的指针的状态。

    • 步骤二 :所以步骤二应是为deque里的指针申请一块内存。但很遗憾,我的做法是让new_node从指向 treenode 变成了 指向另一块内存。

    但实际上只改变了new_node,对目标指针不会有任何改动。

    解决:借助高级指针,或引用。

    改正:

    高级指针

    1.高级指针

    2.利用1的高级指针调整。

     void layer_create(treenode** root,deque& q)
     {
         q.push_front(root);
         while(!q.empty())
         {
             treenode** new_node = q.front();
             char data;
             cin>>data;
             if(data=='#'){
                 *new_node = NULL;
             }
             else {
                 *new_node = new treenode;
                 *new_node->data = data;
                 q.push_back(&(*new_node)->lchild);
                 q.push_back(&(*new_node)->rchild);
             }
             q.pop_front();
         }
     }

    引用

    改正1.引用

    2.引用

     void layer_create(treenode*& root,deque& q)
     {
         q.push_front(&root);
         while(!q.empty())
         {
             treenode*& new_node = *q.front();
             char data;
             cin>>data;
             if(data=='#'){
                 new_node = NULL;
             }
             else {
                 new_node = new treenode;
                 new_node->data = data;
                 q.push_back(&(new_node->lchild));
                 q.push_back(&(new_node->rchild));
             }
             q.pop_front();
         }
     }
     void test()
     {
         layer_create(root,q);
     }
  • 相关阅读:
    STM32F4_HAL_LWIP_RAM接口UDP实验
    论旅行之收获
    猫罐头哪种好吃又健康?精选5款营养美味的猫罐头推荐!
    【教学类-16-01】20221121《数字卡片9*2》(中班)
    大数据的学习历程
    红队内网攻防渗透:内网渗透之内网对抗:隧道技术篇&防火墙组策略&FRP&NPS&Chisel&Socks代理&端口映射&C2上线
    SpringBoot集成MybatisPlus项目实操
    面对多种信号干扰,如何实现高效干扰测试?
    idea 引用本地jar包
    Spirngboot中文乱码解决方案
  • 原文地址:https://blog.csdn.net/m0_59298585/article/details/127713401