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


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

    目录

    错误一

    错误二

    回到树上

    改正:

    高级指针

    引用


    错误一

    错误:指针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);
     }
  • 相关阅读:
    手动撸代码实现Vue管道符过滤器filter功能
    集群调度-01
    matlab2C【g=g1(465:615,200:350);】
    systemverilog中输入输出系统任务和函数(一)——显示相关的任务
    【第十七篇】商城系统-购物车功能设计
    React+TS学习和使用(三):React Redux和项目的路由配置
    ExoPlayer架构详解与源码分析(8)——Loader
    阿里云OS系统Alibaba Cloud Linux 3系统的安全更新命令
    快速集成Skywalking 9(Windows系统、JavaAgent、Logback)
    Unity编辑器拓展最全实现
  • 原文地址:https://blog.csdn.net/m0_59298585/article/details/127713401