数组引用参数有什么用处?

2023-12-23

我最近发现了一些这样的代码:

typedef int TenInts[10];
void foo(TenInts &arr);

你能在身体里做什么foo()这是有用的,如果声明是:

void foo(int *arr);    // or,
void foo(int arr[]);   // or,
void foo(int arr[10]); // ?

我发现了一个问题how传递对数组的引用 https://stackoverflow.com/questions/404232/how-do-i-pass-a-reference-to-a-two-dimensional-array-to-a-function。我想我是在问why.

另外,仅一个答案 https://stackoverflow.com/questions/2038229/when-is-pointer-to-array-useful/2042598#2042598到“数组指针什么时候有用?”讨论了函数参数,所以我认为这不是一个重复的问题。


数组引用参数不允许数组类型衰减为指针类型。即确切的数组类型保留在函数内部。 (例如,您可以使用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 &。数组也不例外。他们没有理由这样做。

请记住,在实践中,编写与运行时大小的数组一起使用的函数通常是有意义的,特别是当涉及通用的库级函数时。这样的功能更加通用。这意味着通常有充分的理由在现实生活中的代码中使用“衰减”方法,尽管如此,这并不能成为代码作者认识到在编译时已知数组大小并使用引用的情况的借口。 - 相应的数组方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数组引用参数有什么用处? 的相关文章

随机推荐