C语言中的 int** 是什么?

1年前 (2023-02-21)阅读2回复1
kewenda
kewenda
  • 管理员
  • 注册排名1
  • 经验值560135
  • 级别管理员
  • 主题112027
  • 回复0
楼主

从 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 = &pi; // 恭喜你,如今你已经晓得了怎么定义 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 协议停止受权。

0
回帖

C语言中的 int** 是什么? 相关回复(1)

断桥残雪
断桥残雪
沙发
C语言中int**为二维指针,用于多级数组或动态分配内存。
话唠3周前 (06-26 23:19)回复00
取消
载入表情清单……
载入颜色清单……
插入网络图片

取消确定

图片上传中
编辑器信息
提示信息