深度剖析堆栈指针

为什么打印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;
}

运行结果

 

 好了,祝你早安,午安,晚安。 

猜你喜欢

转载自blog.csdn.net/Pxx520Tangtian/article/details/132232652