为什么在将多维数组传递给函数时可以省略第一个维度?

10
为什么我们在将多维数组传递给函数时可以省略第一维?
在我的编程课上,我们被告知当将多维数组传递给函数时,可以省略第一维,例如,a[10][15][20]可以作为a[][15][20]传递。
为什么呢?

1
这个问题的被接受的答案已经很好地解释了它。 - Ken White
将n维数组视为具有n-1维元素的简单数组。就像您不会传递1维数组的大小一样,您也不会传递n维数组第一维的大小。 - David Heffernan
当将二维数组传递给C函数时,为什么必须提供一个维数? - phuclv
2个回答

11
因为数组会衰变为指针,而要计算数组元素的偏移量,你不需要了解最内层的维度。a[i][j][k] 的偏移量是 i*nj*nk+j*nk+k (其中 njnk 是相应的维度)。

4

你不能将数组传递给函数。任何声明为采用数组类型的函数都会自动调整为采用相应指针类型。当你在函数调用表达式中使用数组名称时,它会衰减为指向其第一个元素的指针。

这四个声明声明了相同的函数:

void f(int b[10][15][20]);
void f(int (*b)[15][20]);
void f(int b[][15][20]);
void f(int b[100][15][20]);

假设有int a[10][15][20];,以下函数调用是相同的:

f(a);
f(&a[0]);

哦,因为错别字被踩了吗?还是我漏看了什么? - Michael Krelin - hacker
1
@MichaelKrelin-hacker:可能是因为我的回答是错误或无用的原因被踩了。 - CB Bailey
我预计会有人对完全离题、误导或有害的答案进行投反对票,所以我一直在想我是否遗漏了什么…… - Michael Krelin - hacker
不,我没有因为错别字而投反对票,我不知道是谁投了反对票。 - Seth Carnegie
@CBBailey void f(int b[100][15][20]); 应该改为 10 而不是 100,这样它就和第一种方式相同了。因此,就不应该有第四种方式。 - Abhishek Mane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接