传递给函数的二维数组



我一直在阅读这个问题,但我无法得到解决问题的结果代码。我应该如何改变它才能使它工作?

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 *,这样维数就不会干扰参数。然后,在函数体中使用dimension参数为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,这里有一个处理它的方法。由于2D数组在内存中的组织方式与长1D数组相同,因此您可以像这样遍历传入的指针。同样,我们接受输入参数为void *,以避免处理衰减类型。然后,我们将指针视为一个长1D数组,但我们根据适当的维数遍历它:

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

在您的问题中,您正在传递参数作为指向数组的指针。

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

相关内容

  • 没有找到相关文章

最新更新