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

无法将二维数组赋值给二级指针,如何实现**p[i][j]形式打印?

解决二维数组用int**指针访问的类型不匹配问题

你遇到的报错核心是类型不匹配:&matrix的类型是int (*)[2][2](指向2x2 int数组的指针),而你试图把它赋值给int**(指向int指针的指针),这两种类型在C语言里是完全不同的,编译器自然会报错。

下面给你两种可行的实现方式,都能让你用类似p[i][j]的形式访问数组元素:

方法1:使用匹配的二维数组指针类型

直接声明和&matrix类型一致的指针,然后通过解引用指针来访问元素:

#include<stdio.h>
int main (int argc,const char * argv[]){
    int matrix [2][2]={{1,2},{3,4}};
    // 声明指向2x2 int数组的指针,和&matrix类型完全匹配
    int (*p)[2][2] = &matrix;
    int i,j;
    for(i=0;i<2;i++) {
        for(j=0;j<2;j++) {
            // 先解引用p得到整个二维数组,再访问[i][j]
            printf("%d ", (*p)[i][j]);
        }
        printf("\n"); // 换行让输出更清晰
    }
    return 0;
}

方法2:用指针数组模拟int**的访问方式

如果一定要用int**类型的指针,你需要先创建一个指针数组,把二维数组每一行的地址存进去,再让int**指向这个指针数组:

#include<stdio.h>
int main (int argc,const char * argv[]){
    int matrix [2][2]={{1,2},{3,4}};
    // 指针数组,每个元素存储matrix一行的地址(matrix[i]是第i行的首地址,类型为int*)
    int *row_pointers[2] = {matrix[0], matrix[1]};
    // int**指向指针数组的首地址,此时pp[i]就是row_pointers[i],即第i行的地址
    int **pp = row_pointers;
    int i,j;
    for(i=0;i<2;i++) {
        for(j=0;j<2;j++) {
            printf("%d ", pp[i][j]);
        }
        printf("\n");
    }
    return 0;
}

额外说明:别混淆二维数组和int**

很多人会误以为二维数组等价于int**,但其实不是:

  • 二维数组在内存中是连续存储的一块区域,它退化为指针时,是int (*)[N](指向一维数组的指针),而不是int**。
  • int**是指向指针的指针,它指向的是一个存储了多个int*的数组(也就是上面的指针数组),和二维数组的内存布局完全不同。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:52:36