传递2D数组到函数中

3

我一直在阅读这个问题,但是我无法获得解决问题的代码。我该如何更改才能让它起作用?

void print2(int ** array,int n, int m);

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

void print2(int ** array,int n,int m)
{
    int i,j;
    for(i=0;i<n;i++)
    {
       for(j=0;j<m;j++)
       printf("%d ",array[i][j]);

       printf("\n");
    }
}

2
“我不明白你所说的‘我无法得到解决问题的结果代码’是什么意思?” - Sarwar Erfan
编译器无法编译该程序。出现以下错误:警告:传递给print2的第一个参数类型不兼容 我不理解之前问题中给出的解决方案 :s - Jaime Oro
2个回答

5
您传递了一个数组指针,但是您的函数期望一个指向指针的指针。在C语言中,数组名会衰减(decay)为一个值,即第一个数组元素的指针。在这种情况下,第一个数组元素是一个数组,因此函数参数会衰减为一个指向数组的指针。
以下是一个解决方法。将函数修改为使用void *类型接收参数,以免维度干扰参数。然后,在函数体中使用维度参数来创建2D数组的正确指针类型。
void print2(void *p,int n,int m)
{
    int i,j;
    int (*array)[m] = p;
    for(i=0;i<n;i++)
    {
       for(j=0;j<m;j++)
          printf("%d ",array[i][j]);
       printf("\n");
    }
}

如果您愿意更改参数的顺序,那么可以使用数组参数的正确类型:
void print2(int n, int m, int array[n][m])
{
    int i,j;
    for(i=0;i<n;i++)
    {
       for(j=0;j<m;j++)
          printf("%d ",array[i][j]);
       printf("\n");
    }
}

由于Jack问及C89,这里有一种处理方法。既然一个二维数组在内存中的组织方式与一个长的一维数组相同,因此您可以直接按照这样的方式遍历传入的指针。同样,我们将输入参数作为void *来接受,以避免处理衰减类型。然后,我们将指针视为长的一维数组,但根据适当的维度进行遍历:

void print2(void *p, int n, int m)
{
    int i,j;
    int *array = p;
    for(i=0;i<n;i++)
    {
       for(j=0;j<m;j++)
          printf("%d ",array[i*m+j]);
       printf("\n");
    }
}

这个 print2() 函数在 C89 中是否有效? - Jack
@Jack:我的两个答案都依赖于可变长度数组。这两个答案都不适用于C89。 - jxh
就像我想象的一样。谢谢 @user315052 - Jack
1
@Jack:我添加了一个C89的解决方案。 - jxh
非常感谢。如果可以的话,我会点赞的。另外,请不要误解我的意思:“正如我所想象的那样。”并不是我的本意要“粗鲁”。 - Jack

0
在你的问题中,你将参数作为数组的指针传递。 请按照以下方式进行:
void print2(int (*array)[4],int n,int m)
{
    int i,j;
    for(i=0;i<n;i++)
    {
       for(j=0;j<m;j++)
       printf("%d ",array[i][j]);

       printf("\n");
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接