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

C语言传递二维数组时报错expected ‘int **’ but argument is of type ‘int (*)[3]’如何解决

错误根因

你定义的二维数组int array[2][3]属于数组类型的数组,它在传参时会退化为指向其首元素的指针,类型为int (*)[3](指向长度为3的int数组的指针),和你函数声明的int**(指向int指针的指针)类型完全不匹配,因此编译器抛出类型不兼容错误。

解决方法

方法1:使用变长数组(C99及以上标准支持,推荐)

这种写法不绑定第二维的固定长度,适配不同大小的二维数组,且不需要额外构造指针,直接传原数组即可,修改数组元素会同步修改原数组内容,符合你的需求:

#include <stdio.h>
#include <stdlib.h>

// 注意数组维度参数要放在数组参数之前,才能让编译器识别长度
void Func(int sizeFirst, int sizeSecond, int matrix[sizeFirst][sizeSecond])
{
    for (int i = 0; i < sizeFirst; i++)
    {
        for (int j = 0; j < sizeSecond; j++)
        {
            printf("%d\n", matrix[i][j]);
            // 直接对matrix[i][j]赋值就会修改原数组
        }
    }
}

int main()
{
    int array[2][3] = {
        {5,8,2},
        {1,3,6}
    };

    int sizeMain = sizeof(array)/sizeof(array[0]);
    int sizeInner = sizeof(array[0])/sizeof(array[0][0]);
 
    Func(sizeMain, sizeInner, array);

    return 0;
}

你也可以把参数里的数组写法等价替换为指针形式:int (*matrix)[sizeSecond],效果完全一致。

方法2:第二维长度固定时的写法

如果你使用的编译器不支持C99变长数组,且二维数组的第二维长度固定为3,可以直接声明参数为指向固定长度数组的指针:

// 第二维长度固定为3
void Func(int (*matrix)[3], int sizeFirst, int sizeSecond)
{
    // 内部逻辑和方法1完全一致
}

方法3:强制适配int**参数的写法

如果必须保留原函数的int**参数类型,需要额外构造一层指针数组,再把指针数组传入函数:

int main()
{
    int array[2][3] = {
        {5,8,2},
        {1,3,6}
    };
    // 构造指针数组,每个元素指向二维数组的每一行
    int* ptr_arr[2] = {array[0], array[1]};
    int sizeMain = sizeof(array)/sizeof(array[0]);
    int sizeInner = sizeof(array[0])/sizeof(array[0][0]);
 
    Func(ptr_arr, sizeMain, sizeInner);
    return 0;
}

这种方法修改matrix[i][j]依然会修改原数组,但多了一层指针数组的开销,不如前两种方法高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:24:02