为什么打印root的值与&root->value的值是一样的呢
测试结果:
*号一个变量到底取出来的是什么?
以前我写过一句话,就是说,如果看到一个*变量,那就是直逼这个变量所保存的内存地址,然后取出里面保存的对应的值或者地址,
那么这句话该怎么来理解,可以这样讲
那么像上面打印的结果都是一样的,取出来的都是&num1的地址
下面上具体的代码说明:
#include <cstdio>
#include <cstdlib>
using namespace std;
int main()
{
int num1 = 3;
int *p_num1 = &num1;
int **pp_num1 = &p_num1;
int ***ppp_num1 = &pp_num1;
printf("%d\n",*p_num1);//直逼num1,所以打出来是3
printf("%d %d\n",*pp_num1,&num1);//直逼p_num1,取出来就是num1的地址
printf("%d %d\n",*ppp_num1,&p_num1);//直逼pp_num1,取出来p_num1的地址
//第一个*号直逼pp_num1,取出&p_num1地址
//第二个*号直逼p_num1,取出&num1的地址
printf("%d %d\n",**ppp_num1,&num1);
//这里有两个**,一个*直逼pp_num1保存的地址就是p_num1,取出来是
//&num1的地址,然后再来一个*,直逼num1的地址,取出来的就是3
printf("%d\n",**pp_num1);
return 0;
}
运行结果:
,&(*root)->left这个表达式为什么会报错
说这个之前,我们先来分析一下下面这些表达式的取值
表达式1:printf("%d %d %d %d\n",&(*root),root,&root->value,&root);
表达式2:printf("%d %d\n",&(*pp_root)->left,&root->left);
表达式3: printf("%d %d %d\n",(*pp_root)->left,root->left,&child->value);
再来说说,&(*root)->left它为什么报错
先来看一张图
再来分析上面首先*root是返回一个node对象本身,没有指针引用,因此->left编译器是会报错的
既然是返回node对象本身,那么就可以用.来进行引用,像下面这两个表达式值都是一样的
这也就是它报错的原因
二叉树内存节点分析
当你*号直逼一个堆上分配的地址的时候,返回的是什么
那么这个*p_root返回的是一个什么,我之前说了,如果*号一个变量,那么就是直逼这个变量保存的内存地址取值,要么是一个地址要么是一个值。
这里*p_root很明显是如下蓝色箭头指向的情况
这样会取出来一个地址不会报错,但是这个地址啊,其实是没有什么实际意义存在的,可以这样理解,它就是返回在堆上的node对象
既然是一个对象,我们就可以用.(点号去访问里面的成员)
上代码
#include <cstdio>
#include <cstdlib>
struct node
{
int value;
node *next;
};
int main()
{
node *p_root = new node;
node *p_next = new node;
p_root->next = p_next;
p_root->value = 520;
p_next->value = 666;
p_next->next = NULL;
printf("%d %d\n",p_root,*p_root);//前者是p_root在堆上的地址,后者是它在堆上引用
//引用返回一个node对象,而不是一个指针,就用.号去访问成员
printf("%d %d\n",(*p_root).value,(*p_root).next);//这里注意运算符优先级顺序,点.的优先级绝对高
/**
*value是520,然后地址打印的是p_next指向的在堆上的地址
*/
return 0;
}
运行结果
好了,祝你早安,午安,晚安。