假设我有两个像这样的维数:
A [2] [3] = {{1,2,4},{2,5,15}}
如果我将它作为函数参数传递
#include <stdio.h>
int fun(int A[][3]) // or int fun( int (*A)[3])
{
.
.
}
main()
{
int A[2][3] = {{1,2,4},{2,5,15}};
fun(A);
}
问)为什么第一个块在函数参数中可以为空,如[]并且它可以保持为空,为什么其他人也可以像A [] []一样保持空白?或者为什么这是错误的**作为函数参数?
现在,如果我有一个像这样的三维数组:
A [2] [3] [4] = {{{2,21,12,34,23},{322,34,34,23},{323,32,112,324}},{{23,231,21,233 },{23,5,65,2},{3,23,234,34}}}
如果我将它作为函数参数传递
#include <stdio.h>
int fun(int A[][3][4]) // or int fun( int (*A)[3][4])
{
.
.
}
main()
{
int A[2][3][4] = {{{2,21,12,34,23},{322,34,34,23},{323,32,112,324}}, {{23,231,21,233},{23,5,65,2},{3,23,234,34}}}
fun(A);
}
问)为什么第一个块在函数参数中可以为空,如[]并且它可以保持为空,为什么其他人也可以像A [] [] []那样保持空白?或者为什么这是错误的***作为函数参数?
答案 0 :(得分:3)
标准说:
“N T数组”或“未知数组的数组”的左值或右值 “可以将T”转换为“指向T的指针”的右值。结果 是指向数组第一个元素的指针。
简单地说,它允许将参数int A[x][y][z]
转换为int (A*)[y][z]
。我们通常会说这样的数组 将 衰减为指针。
标准还说:
仅在指针*与数组不同的参数声明 []是等价的。也就是说,数组声明被调整为 成为指针声明(8.3.5)。只有第二个和后续的 数组维度在参数类型中很重要(8.3.4)。
这意味着int (A*)[y][z]
在用作函数参数时与int A[][y][z]
没有区别。
因此,可以将int A[x][y][z]
(但不是int A[][][z]
或int A[][][]
等)传递给需要int A[][y][z]
类型参数的函数。
为什么需要低维度的大小?因为编译器需要知道元素A*
的类型指向(这里是int [y][z]
)以便它可以正确地做指针算术。例如A's value = A's value + sizeof(int) * y * z
,++A
。
答案 1 :(得分:1)
您可以将指针传递给任意大小的数组作为参数,但如果您希望编译器使用它进行指针运算,则编译器需要知道各种维度的大小。有关详细说明,请参阅Passing multidimensional arrays as function arguments in C。