除非它是sizeofor 一元运算符的操作数&,或者是用于在声明中初始化另一个数组的字符串文字,否则“N 元素数组T”类型的表达式将被转换(“衰减”)为类型的表达式“指针T”,表达式的值是数组第一个元素的地址。
如果正在传递的数组的声明是
int S[4][4] = {...};
那么当你写
rotateArr( S );
表达式S的类型为“4 元素数组的 4 元素数组int”;由于S不是sizeofor 一元运算符的操作数&,它将被转换为类型为“指向 4 元素数组的指针”的表达式int,或者int (*)[4],这个指针值是实际传递给 的rotateArr。所以你的函数原型需要是以下之一:
T rotateArr( int (*arr)[4] )
或者
T rotateArr( int arr[][4] )
甚至
T rotateArr( int arr[4][4] )
在函数参数列表的上下文中,形式的声明T a[N]和T a[]被解释为T *a; 这三个都声明a为指向T.
您可能想知道为什么我将返回类型从 更改int为T. 如所写,您试图返回“4 元素数组的 4 元素数组int”类型的值;不幸的是,你不能这样做。C 函数不能返回数组类型,也不能分配数组类型。IOW,你不能写这样的东西:
int a[N], b[N];
...
b = a; // not allowed
a = f(); // not allowed either
函数可以返回指向数组的指针,但这不是你想要的。 D函数返回后将不复存在,因此您返回的任何指针都将无效。
如果要将旋转数组的结果分配给不同的数组,则必须将目标数组作为参数传递给函数:
void rotateArr( int (*dst)[4], int (*src)[4] )
{
...
dst[i][n] = src[n][M - i + 1];
...
}
并将其称为
int S[4][4] = {...};
int D[4][4];
rotateArr( D, S );