C++ 二级指针的理解

指针一直很抽象,不是很容易理解,尤其是二级指针。有天路上,脑子里突然想起二级指针,并开始思考什么是二级指针,经过分析和调试验证,对二级指针有了进一步的认识。故写下此篇。

一级指针

假设变量 a、p 的地址分别为 0X1000、0XF0A0,它们的指向关系如下图所示:

img

程序被编译和链接后,a、p 被替换成相应的地址。要使用 p获取a的值的话,需要先通过地址 0XF0A0 取得变量 p 本身的值(0X1000),这个值是变量 a 的地址,然后再通过这个值取得变量 a 的数据。

如果理解这上面的话,那么接下来就可以看看二级指针了。

二级指针

通过以下这段代码,进入调试模式,来看看二级指针到底是什么样子

int a = 10;
int* p = &a;
int** pp = &p;

在这里插入图片描述

变量如表格所示:

名称 类型
a 10 int
p 0x000000ddaed9fb84 {10} int *
10 int
pp 0x000000ddaed9fba8 {0x000000ddaed9fb84 {10}} int * *
0x000000ddaed9fb84 {10} int *
10 int

可以看到,变量a的值是10,指针p的值是0x000000ddaed9fb84 ,这个地址指向10所处的内存地址,二级指针pp的值是0x000000ddaed9fba8 这个地址指向0x000000ddaed9fb84 内存地址。

接下来,再看一下内存
在这里插入图片描述
在这里插入图片描述

0x000000ddaed9fb84内存地址所存放的是0a(16进制),即10进制的10。

0x000000ddaed9fba8 内存地址所存放的是0x000000ddaed9fb84,即存的是p所在的内存地址。

通过调试能有个更直观的感受,现在看来,a不过存的是值10,p存的是值地址,pp同样也是存的值地址。

也就是说,二级指针pp本身就是指针,或者说‘’特殊的一级指针“,没什么特别的地方,无非就是存的数据有些差异。

那么如何将值取出来应该就很清晰了

int a = 10;
int* p = &a;
int** pp = &p;

int pa = *p; //解引用
int ppa = **pp; //二次解引用

最后,对二级指针的感悟又进了一步。

猜你喜欢

转载自blog.csdn.net/no_say_you_know/article/details/129339724