You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中int **p的含义、存储值类型及赋值运行逻辑是什么?

C语言 int **p 概念与用法解答

具体含义

int **p 是C语言中的二级指针,也就是指向指针的指针。你已经了解int *p是存储int类型变量内存地址的一级指针,int **p的层级比它多一层,专门用来存储一级int指针的地址。

存储的值类型

int **p本身存储的是一个内存地址,这个地址指向的内存单元中存储的是int *类型的一级指针对象。简单来说:

  • *p 取到的是一个int *类型的一级指针
  • **p 取到的是最终的int类型值

赋值操作的运行逻辑

赋值分三种不同的操作对象,逻辑各不相同,我们结合代码示例说明:

int num = 1024;
int *p1 = # // 一级指针p1存储int变量num的地址
int **p = NULL; // 声明二级指针p,初始化为空
  • 给p本身赋值:需要传入int *类型指针的地址,赋值后p就指向对应的一级指针。比如执行p = &p1后,p存储的就是p1这个指针变量本身的内存地址。
  • 给*p赋值:等价于给p指向的一级指针赋值。比如执行*p = &num,和直接执行p1 = &num的效果完全一致。
  • 给**p赋值:等价于给最终指向的int变量赋值。比如执行**p = 2048,和直接执行num = 2048的效果完全一致。

二维数组场景的应用逻辑

你提到的用指针创建二维数组的场景,是二级指针最常见的用法:

// 动态创建3行5列的二维数组
int row = 3, col =5;
// 先申请一个长度为row的一级指针数组,arr指向这个数组的首地址
int **arr = (int **)malloc(row * sizeof(int *));
for(int i=0; i<row; i++){
    // 每个一级指针指向一行长度为col的int数组
    arr[i] = (int *)malloc(col * sizeof(int));
}

这里的arr作为二级指针,存储的是指针数组的首地址,arr[i]对应指针数组第i个元素,也就是第i行数组的首地址,arr[i][j]就可以直接访问第i行第j列的int元素。


内容的提问来源于stack exchange,提问作者rayo7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:15:02