从 int* 和 int 说起
“int**是什么” 那个问题其实不难。 我们能够递归阐发,先看下 int*是什么,嗯?仿佛还能够继续递归到 int
我们都晓得,int是 C 的根底数据类型 整型,而多了个 * 的 int* 是 指向整型变量的指针,那么 int** 是什么就不言自了然,列个表:C语法释义int整型int*指向「整型」的指针int**指向「指向整型的指针」的指针看到那里,你对 int** 应该有了个初步的认识,但你可能觉得有点绕,不妨,下面我们写一段代码看看:
#include <stdio.h> int main() { int i = 418; int* pi; // 按照上面的表格,我们晓得 int* 是指向“整型”的指针, // 那么 pi 能够保留的是 int 类型的变量 i 的地址: pi = &i; int** ppi; // ppi 能够保留的是 int* 类型的变量 pi 的地址: ppi = π // 恭喜你,如今你已经晓得了怎么定义 int** 类型的变量和给它赋值 // 我们先写到那里 return 0; } 深切思虑假设定义有 int** p(为了便利,我们暂且把 p 认为是 ppi 的别号),那么 p, *p, **p, p + 1, *p + 1, *(p + 1), **p + 1, *(*p + 1), **(p + 1) 别离是什么?
先看最指针本身乍一看有点多,起头有点慌是吧,不妨,我们先看不带加法运算的前三个:p, *p 以及 **p
从上面的代码我们已经晓得 p 就是存放 int* 类型变量的地址的变量 // 从上面暂停下来的处所我们继续 // 我们都晓得,在指针前面加个 * 就是“获得那个指针指向的地址里的值” // 因为 pi 存放的是 i 的地址,那么 *pi 就是获得 i 存放的值,类型是 int // 同理,*ppi 获得的是 pi 存放的值,类型是 int* printf("*pi = %d, *ppi = %p\n", *pi, *ppi); // 输出 *pi = 418, *ppi = 0000002D6FF2FD58 (*pi = 后面的值在每台机器上都可能纷歧样) // 既然 *ppi 是 int*,那也就是说我们还能够对它再做一次解引用, // 拿到 *ppi 那个地址里存放的值,类型是 int printf("**ppi = %d\n", **ppi); // 输出 **pi = 418那时,你已经掌握 p, *p 以及 **p 别离是什么了
再看指针的加法运算接下来我们仍是先挑最简单的,把不带 * 的拿出来:p + 1,指针 p 做了个加法运算。
那么它加的那个 1 是什么?数字1?1位?1字节?
都不是,C指针加法运算里的数字操做数的单元是指针的长度,也就是说 p + 1 暗示的时候内存中,紧挨着 p 的下一个可用空间的地址:
printf("ppi = %p, ppi + 1 = %p\n", ppi, ppi + 1); // 输出 ppi = 0000008CA96FFB78, ppi + 1 = 0000008CA96FFB80 // 而且我们能够看到 0000008CA96FFB80 - 0000008CA96FFB78 = 8(16进造) // 刚好等于 x64 系统下 1 个指针的大小:8 字节那 *(p + 1) 是什么你应该也晓得了,就是 p + 1 那个地址(假设是合法的)存放的值,类型是 int*。 而 *p + 1 就是 *p 那个地址再偏移了 1 个指针长度
printf("*ppi = %p, *ppi + 1 = %p\n", *ppi, *ppi + 1); // 输出 *ppi = 0000002D6FF2FD58, *ppi + 1 = 0000002D6FF2FD60 printf("pi = %p\n", pi); // 输出 pi = 0000002D6FF2FD58 // 能够看到 *ppi == p好了,还剩下最初三个:**p + 1, *(*p + 1), **(p + 1),先尝尝连系上面的常识,想一下在我们的例子中那三个别离是什么,想好之后再看下面的谜底查验一下本身理解得对不合错误: - **p + 1:**p 获得的是 int,值是 418,所以 **p + 1 是 419
*(*p + 1):*p + 1 是 0000002D6FF2FD60,那么 *(*p + 1) 就是获得那个地址中的值(假设地址都是合法的)
**(p + 1):先对 p + 1 那个地址做解引用,得到新的地址 *(p + 1),然后再对新的地址做解引用,得到的是个 int(假设地址都是合法的)
再给你 int*** 你也能答复了如今再给你 int***,相信你也晓得它是什么了:
C语法释义int***指向「指向指向整型的指针的指针」的指针...指向 ... 的指针册本保举《征服C指针》[日]前桥和弥 著 豆瓣读书本文首发于本人博客:C语言中的 int** 是什么?
本文接纳 CC BY 4.0 协议停止受权。