gpt4 book ai didi

c++ - 对数组的引用参数有什么用?

转载 作者:IT老高 更新时间:2023-10-28 13:02:20 25 4
gpt4 key购买 nike

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

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 to pass a reference to an array .我想我在问为什么

另外,只有 one answer到“指向数组的指针什么时候有用?”讨论了函数参数,所以我不认为这是一个重复的问题。

最佳答案

reference-to-array 参数不允许数组类型衰减为指针类型。即确切的数组类型保留在函数内。 (例如,您可以在参数上使用 sizeof arr/sizeof *arr 技巧并获取元素计数)。编译器还将执行类型检查,以确保数组参数类型与数组参数类型完全相同,即如果参数声明为 10 个整数的数组,则参数必须是正好 10 个数组整数,仅此而已。

事实上,在数组大小在编译时固定的情况下,使用数组引用(或数组指针)参数声明可以被视为主要参数,传递数组的首选方式。另一种变体(当数组类型被允许衰减为指针类型时)保留用于需要传递 run-time 大小的数组的情况。

例如,将编译时大小的数组传递给函数的正确方法是

void foo(int (&arr)[10]); // reference to an array

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 & 来传递它。数组也不异常(exception)。他们没有理由这样做。

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

关于c++ - 对数组的引用参数有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2188991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com