首先,void f(a[ ][ ]);是不正确的定义
二维数据作为函数参数时,要明确指明二维数组的列数,这样编译器才能知道如何寻址。
正确的方式有: void f (a[4][6]);
void f(a[ ][6]);//二维数组的行数可以省略
另外,也不能用非常量定义二维数组作为其下标。
void f ( a[m][n]);是严重错误的;
正确的应用模式一
void func1(int iArray[ ][10])
{
}
int main()
{
int array[10][10];
func1(array);
}
正确的应用模式二(应用一维指针数组作为参数)
void func2(int (*pArray)[10])
{
}
void func2_1(int (*pArray)[ ]) //编译通过,无法调用
{
}
int main()
{
int array[10][10];
func2(array);
}
正确的应用模式三(应用二维数组引用作为参数)
void func3(int (&pArray)[10][10])//在此必须指明二个维数
{
}
int main()
{
int array[10][10];
func3(array);
}
正确的应用模式四(应用二维指针数组作为参数)
void func4(int (*pArray)[10][10])//必须指定二个维数
{
}
int main()
{
int array[10][10];
func4(&array);
}
注:以上四种方法通用,但是数组传递时,仅传值,对传入参数不做改变
补充:应用二重指针作为形参,传入的实参也必须是二重指针,巧妙地利用new分配内存空间,可以用非常量定义
void func5(int** pArray, int m, int n)
{
}
#include <ctime>
int main()
{
int m = 10;
int n = 10;
int** pArray = new int* [m];
pArray[0] = new int[m * n]; // 分配连续内存,动态创建二维数组
// 用pArray[1][0]无法寻址,还需指定下标寻址方式
for(int i = 1; i < m; i++)
{
pArray[i] = pArray[i-1] + n;
}
func5(pArray, m, n);
}