1.如果是在堆内存中申请的二维数组
double **a=new double*[n];
for(int i=0;i<n;i++)
a[i]=new double[m];
此时函数参数直接写为(double **a, int n, int m)即可,可按a[i][j]访问数组元素。
2.如果是直接定义的二维数组
double a[3][3]={{2.0},{2.2,2.6},{5.2}};
由于a[3][3]和a[3][4]的类型不一样,且都不是double**,又由于二维数组类型千千万,所以不可能通过一个个重载的方式来写函数。此时可以把函数参数写为(void *a, int n, int m)来解决。因为这种方式定义的二维数组的元素在内存中是连续排列的,所以当访问具体元素时,可以先把a强制转化为一维指针类型,再按顺序访问。
double *b=(double*)a;
double c=*(b+m*i+j);//此即a[i][j]
但这个方法有个缺点,就是void*是可以任意匹配的,你可能传个三维数组过来他也接受,所以不太安全。
注意:一、1中的a不能传给2中的函数:因为a[0]到a[n-1]存储的是地址,之后存储的不是我们的数据,如果传给2中的函数用一维数组的方式来访问的话就错了。
二、2中的a不能传给1中的函数:首先是类型不匹配问题,其次如果强制类型转化的话也不行,因为1中的函数需要a[0]到a[n-1]存的是地址,但我们的实参中存的是数。
三、double**会严格匹配1中的函数,而a[3][4]由于找不到严格匹配的函数,会去匹配2中的函数。
综上,同时重载这两个函数即可解决问题:void fn(double **a, int n, int m)和void fn(void *a, int n, int m)
如果读者发现问题,欢迎指正。