c - 传递给函数的二维数组

标签 c arrays pointers multidimensional-array

我一直在读这个question但我无法获得解决问题的结果代码。 我应该如何更改它才能使其正常工作?

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");
    }
}

最佳答案

您正在传递一个指向数组的指针,但您的函数需要一个指向指针的指针。 在 C 语言中,数组名称衰减为指向第一个数组元素的指针的值。在这种情况下,第一个数组元素是一个数组,因此函数参数衰减为指向数组的指针。

这是解决此问题的一种方法。将函数更改为采用 void *,这样维度就不会干扰参数。然后在函数体中使用维度参数为二维数组创建正确的指针类型。

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");
    }
}

关于c - 传递给函数的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16822496/

相关文章:

c - 我无法理解以下代码中的位置 c=0 和 l=0

c - 为什么“while(!feof(file))”总是错误的?

c - 如何使用c自动启动PC

c - 在 C 中处理多维数组的列

c - 指针和 realloc 的问题,C 中的程序崩溃错误

java - Pact - 匹配整数数组

php - 如何组合具有不同数组结果的 2 个 Foreach 循环?

c# - 可为空的短整型和数组

c++ - 如果你给一个指针加1,它是真的加1,还是加4或32?

c - 重新分配指针后分配的内存