在写二叉搜索树的时候,碰到一个问题,就是利用二级指针来改变一级指针保存的地址问
题。
上面就是一棵树,然后我们用函数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