1.问题:写基数排序过程中发现需要进行二维数组形参(当然可以替换其他方式解决,比如用一位数组模拟桶),发现竟然编译不能通过,错误代码大致如下:
void error_array(int **a,int m,int n)
{
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
printf("%d ",a[i][j]);
}
puts("");
}
}
int main()
{
int a[2][4] = {1, 2, 3, 4,5, 6, 7, 8};
testArray(a,2,4);
}//error: cannot convert `int (*)[4]' to `int*' for argument `1' to `void testArray(int*, int, int, int)'
2.网上提供的常见版本
void func1(int a[][3],int m,int n)//数组名作形参,3不可省去
{
puts("-------func1-------");
for(int i = 0; i < m; ++i)
{
for(int j = 0; j < n; ++j)
{
printf("%d\t",a[i][j]);//
}
puts("");
}
}
void func2(int (*a)[3],int m,int n)//一维数组指针(行指针)作形参,3不可省去
{
puts("-------func2-------");
for(int i = 0; i < m; ++i)
{
for(int j = 0; j < n; ++j)
{
printf("%d\t",a[i][j]);//
}
puts("");
}
}
void func3(int **a,int m,int n)//指针的指针作形参
{
puts("-------func3-------");
for(int i = 0; i < m; ++i)
{
for(int j = 0; j < n; ++j)
{
printf("%d\t",*((int *)a+i*n+j));//a[i][j]不行
}
puts("");
}
}
int main()
{
int array[2][3]={{2,3,5},{7,11,13}};
func1(array,2,3);
func2(array,2,3);
func3((int **)array,2,3);
}
3.另外一种新方式
3.1首先分析上面的三种方式,本质上func1、func2一样的,都是一个行指针,但是常数3不能省去;func3的取值方式不方便,尤其是更高维,综合这两种方式,提出下面的解决方案
3.2新方式
void func0(int *a,int m,int n)//int *a可写成int a,int **a,int ***a,实参对应即可
{
puts("-------func0-------");
int (*p)[n]=(int (*)[n])a;
for(int i = 0; i < m; ++i)
{
for(int j = 0; j < n; ++j)
{
printf("%d\t",p[i][j]);//
}
puts("");
}
}
参考:http://blog.csdn.net/yunyun1886358/article/details/5659851