比如一维数组作函数参数时:f(int a[10]) 会被转换成f(int *a),即传递过去的是一维数组的首地址。所以即使你有个数组 int b[5],也能传递进int [10]做参数的函数。
二维数组作函数参数时:f(int a[10][5]) 后面的那个维数会被丢弃,转换为,f(int (*a)[10]),
之所以要保留除了第一维以外的维数,是因为int (*a)[10]是一个指向10个int组成的数组的指针,而不是int* 指针。
这个很难理解的,你必须把指针学好,很多入门的C语言书上会有解释,想一下就懂是不可能的,慢慢理解。
不清楚你学指针没,如果学了这个问题就好说了.二维数组是一个二级指针,而一维数组就是一个普通的指针.二维数组其实也是一维的,只是它的一个元素还是一个数组.而一维数组要得到一个元素可以这样:*(p+i) 这样是完全等价于p[i]的.而二维数组想要得到它其中的一个元素就要这样:
int i[10][3];
i[1][2] == *(i + 10*1 + 2);
但如果说这个数组是int i[10][30];就不能通用上面的公式,所以如果得到一个二维数组的元素就要由类型来定.如上代码,i是一个int *[3]类型的.
二维数组做形参时可以省略第一个维度,第二个不能省