2013-05-29 152 views
3

我一直在阅读这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"); 
    } 
} 
+2

你是什么意思**“我不能得到最终的代码来解决问题”**? –

+0

编译器无法编译该程序..出现以下错误:'警告:从不兼容的指针类型传递print2的arg 1' 我不明白上一个问题中给出的解决方案:s –

回答

5

你正在传递一个指向数组的指针,但你的函数需要一个指向指针的指针。 在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"); 
    } 
} 

由于杰克问C89,这里有一个方法来处理它。由于2D数组的组织方式与内存中的长1D数组相同,因此您可以像传入的指针那样行走。再次,我们接受输入参数作为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"); 
    } 
} 
+0

这是最后一个' print2()'函数在C89中有效吗? – Jack

+0

@Jack:我的答案都依赖于可变长度数组。这两个都不适用于C89。 – jxh

+0

正如我所想象的那样。谢谢@ user315052 – 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"); 
    } 
}