Jai*_*Oro 3 c arrays pointers multidimensional-array
我一直在阅读这个问题,但我无法得到结果代码来解决问题.我应该如何更改它以使其工作?
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");
}
}
Run Code Online (Sandbox Code Playgroud)
您正在传入一个指向数组的指针,但您的函数正在指向指向指针的指针.在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");
}
}
Run Code Online (Sandbox Code Playgroud)
如果您愿意更改参数的顺序,那么您可以为数组参数使用正确的类型:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
因为杰克问起C89,这是一种处理它的方法.由于2D数组的组织方式与内存中的长1D数组相同,因此您可以直接遍历传入的指针.同样,我们接受输入参数作为a 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");
}
}
Run Code Online (Sandbox Code Playgroud)