假设我有两个二维数组,如下所示:
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作为函数参数?
现在,如果我有一个三维数组,如下所示:
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 [] [] []那样留空?还是为什么这是错误的*** A作为函数参数?
标准说:
可以将“ NT数组”或“ 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]
or int A[][][]
,等等)给需要type参数的函数int A[][y][z]
。
为什么需要小尺寸的尺寸?因为编译器需要知道要A*
指向的元素的类型(此处是int [y][z]
),以便它可以正确执行指针算术。例如,A's value = A's value + sizeof(int) * y * z
当你++A
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句