指针一直很抽象,不是很容易理解,尤其是二级指针。有天路上,脑子里突然想起二级指针,并开始思考什么是二级指针,经过分析和调试验证,对二级指针有了进一步的认识。故写下此篇。
一级指针
假设变量 a、p 的地址分别为 0X1000、0XF0A0,它们的指向关系如下图所示:
程序被编译和链接后,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; //二次解引用
最后,对二级指针的感悟又进了一步。