将多维数组作为函数参数传递

时间:2014-08-11 23:13:51

标签: c arrays pointers multidimensional-array

假设我有两个像这样的维数:

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 [] [] []那样保持空白?或者为什么这是错误的***作为函数参数?

2 个答案:

答案 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