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
相关产品推荐
相关产品推荐

