关于二级指针保存一级指针的问题

在写二叉搜索树的时候,碰到一个问题,就是利用二级指针来改变一级指针保存的地址问

题。

上面就是一棵树,然后我们用函数delete_node这个函数去改变每一个根结点指向的左子树或者是右子树的地址。我们考虑传入一级指针呢?

假设我就要传一级指针呢 

我们可以直接返回上面这个root的地址

那我们这里还是传入一个二级指针,直接指向上面的root,然后做一些后续的操作

下面看一些测试代码


int main()
{
    int num = 5;
    int *pnum1 = #
    int **ppnum1 = &pnum1;
    //下面两个是一样的
    printf("%d\n",*ppnum1);//取出来的应该是num1的地址,也就是一个一级指针
    printf("%d\n",&num1);
    //通过二级指针取值出来
    printf("%d\n",*(*ppnum1));//这里打印的就是5,指向了一级指针的位置取值

    //指针之间的赋值是什么意思
    int *pnum2 = &num1;
    int *pnum3 = NULL;
    pnum3 = pnum2;//pnum3保存了pnum2指向的地址
    printf("%d  %d\n",pnum2,pnum3);//就是num1的地址,指向了num1的地址


    //通过二级指针变成一级指针来操作
    TestStu *stu = new TestStu;
    // //c语言的做法
    // ts *t1 = (ts*)malloc(sizeof(ts));
    stu->name = "pxx";
    stu->num = 123;
    TestStu *stu1 = stu;
    //用一个二级指针来保存一级指针地址
    TestStu **stu2 = &stu;//用二级指针保存一级指针的地址
    //退化成一级指针访问
    (*stu2)->name;
    (*stu2)->num;

    printf("%s %d\n",(*stu2)->name,(*jinstu2)->num);



    return 0;
}
#include <cstdio>
#include <cstdlib>
#include <string>

using namespace std;


/**
 *问题1:*一个一级指针的问题
 取出来的是什么 
  *取出来的一级指针保存的地址的值,既然可以取,自然也可以改
   //普通的一级指针,取出来的是什么?
    int num1 = 3;
    int num2 = 4;
    int *p_num1 = &num1;
    printf("%d\n",*p_num1);//*一个一级指针取出来的就是里面的值,这里是3
    *p_num1 = 5;//我们还可以用*号指过去然后改变保存地址的值
   // *p_num1 = &num2;这样的操作是不可以的,因为这里相当于是一个int类型和一个指针类型
   类型不同,无法直接赋值

   问题2:二级指针保存一级指针的地址,然后*二级指针取出来的又是什么
   *二级指针取出的就是一个一级指针的地址,也就是一片空间
   如果说这片空间是new出来的,那么肯定会在堆上面开辟一个空间
   堆上面也是有地址的,一级指针可以去指向这片地址
    如果空间是new出来的,那么*二级指针就是指向了这片new的空间


 */

struct people {
    string name;
    int age;
};

int main()
{

    //普通的一级指针,取出来的是什么?
    int num1 = 3;
    int num2 = 4;
    int *p_num1 = &num1;
    printf("%d\n",*p_num1);//*一个一级指针取出来的就是里面的值,这里是3
    *p_num1 = 5;//我们还可以用*号指过去然后改变保存地址的值
   // *p_num1 = &num2;
    
    //*一个二级指针取出的是
    int **pp_num1 = &p_num1;//这里保存的是p_num1的地址
    //*一个二级指针看看取出来什么
    printf("*second rank pointer is : %d\n",*pp_num1);//2293276,指向了一级指针的空间
    printf("%d\n",(*pp_num1)->num1);
    printf("These two addresses are the same:%d  %d\n",&num1,*pp_num1);//干到p_num1的地址上,取出来的是不是下一个地址呢,确实是这样的
    //在堆上面分配片空间,c++是new出来,那么new出来的也是一片地址
    people *p1 = new people;
    p1->name = "pxx";
    p1->age = 20;

    people *p2 = p1;//把p1指向的的地址交给了p2
    printf("p1 and p2 space on the heap is :%d %d\n",p1,p2);//8540016 8540016
    printf("p1 is address: %d\n",&p1);//2293256

    people **pp1 = &p1;

    //用*号访问二级指针就是访问了二级指针保存的一级指针的地址
    printf("%d\n",*pp1);//8540016,指向的是p1保存的空间
    printf("%d\n",pp1);//2293256


    return 0;
}

下面来说一个运算符优先级的问题

 三张图说明二叉树内存节点关系

图1 

图2 

 

图3 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值