数组引用参数不允许数组类型衰减为指针类型。即确切的数组类型保留在函数内部。 (例如,您可以使用sizeof arr / sizeof *arr
对参数进行欺骗并获取元素计数)。编译器还将执行类型检查,以确保数组参数类型与数组参数类型完全相同,即,如果参数声明为 10 个整数的数组,则参数必须是恰好 10 个整数的数组整数,没有其他。
事实上,在数组大小固定为的情况下编译时,使用数组引用(或数组指针)参数声明可以被视为传递数组的主要首选方式。另一种变体(当允许数组类型衰减为指针类型时)是为需要传递数组的情况而保留的run-time size.
例如,将编译时大小的数组传递给函数的正确方法是
void foo(int (&arr)[10]); // reference to an array
or
void foo(int (*arr)[10]); // pointer to an array
一种可以说是不正确的方法是使用“腐烂”的方法
void foo(int arr[]); // pointer to an element
// Bad practice!!!
“衰减”方法通常应保留用于运行时大小的数组,并且通常在单独的参数中附有数组的实际大小
void foo(int arr[], unsigned n); // pointer to an element
// Passing a run-time sized array
换句话说,当涉及到数组引用(或数组指针)传递时,实际上不存在“为什么”问题。如果数组大小在编译时固定,那么默认情况下,只要有可能,您就应该自然地使用此方法。当您使用数组传递的“衰退”方法时,真正应该出现“为什么”问题。 “decayed”方法只应该用作传递运行时大小的数组的专门技巧。
上述基本上是更通用原则的直接结果。当你有一个“重”类型的物体时T
,通常通过指针传递它T *
或通过参考T &
。数组也不例外。他们没有理由这样做。
请记住,在实践中,编写与运行时大小的数组一起使用的函数通常是有意义的,特别是当涉及通用的库级函数时。这样的功能更加通用。这意味着通常有充分的理由在现实生活中的代码中使用“衰减”方法,尽管如此,这并不能成为代码作者认识到在编译时已知数组大小并使用引用的情况的借口。 - 相应的数组方法。