将二维数组当作参数的时候,必须指明所有维数大小或者省略第一维的,但是不能省略第二维或者更高维的大小,这是由编译器原理限制的。
对于数组 int p[m][n];
如果要取p[i][j] 的值,编译器是这样寻址的,它的地址为: p + i * n + j;
从以上可以看出,如果我们省略了第二维或者更高维的大小,编译器将不知道如何正确。
所以,如果将二维数组作为函数的入口参数,必须指定第二维的大小。例如函数:
void func1(int arry[][5])
void func2(int arry[2][5])
对于如下的写法,是错误的:
void func3(int arry[][])
void func4(int arry[2][])
void func5(int **arry)
值得一提的是
void func5(int **arry)
编写函数无问题,编译器也可以通过,代码如下
void func5(int **arry);
void main(void)
{
int arry[2][5];
func5((int **)arry);
}
实际调用函数func5的时候,如果索引到二维数组的具体某一个元素时,会出现软件崩溃。因为没有指定数组的第二维大小,编译器无法找到对应的数据。
应用举例:有一个M行N列的二维数组,求取每一行的最大值。
#include <stdio.h>
#define M 10
#define N 5
void LineMax(int data[N][M], int line, int column, int *result)
{
int i = 0;
int j = 0;
int max = 0;
for (i = 0; i < line - 1; i++)
{
for ( j = 0; j < column - 1; j++)
{
if (data[i][j] > max)
{
max = data[i][j];
}
}
result[i] = max;
max = 0; // 最大值复位,以免上一次比较照成的错误
}
}
int main(int argc, char* argv[])
{
int arry[N][M] =
{
{1, 2, 3},
{5, 4, 8},
{9, 0, 6},
};
int max[N] = {0};
LineMax(arry, N, M, max);
return 0;
}