【问题标题】:Passing an array by reference通过引用传递数组
【发布时间】:2011-08-09 02:41:20
【问题描述】:

如何通过引用传递静态分配的数组?

void foo(int (&myArray)[100])
{
}

int main()
{
    int a[100];
    foo(a);
}

(&myArray)[100] 是否有任何意义,或者它只是一种通过引用传递任何数组的语法? 我不明白单独的括号后面跟着大括号。谢谢。

【问题讨论】:

标签: c++ arrays


【解决方案1】:

这是数组引用的语法 - 您需要使用 (&array) 向编译器说明您想要引用数组,而不是引用数组 int & array[100]; 的(无效)数组。

编辑:一些澄清。

void foo(int * x);
void foo(int x[100]);
void foo(int x[]);

这三种是声明同一个函数的不同方式。它们都被视为采用int * 参数,您可以将任何大小的数组传递给它们。

void foo(int (&x)[100]);

这仅接受 100 个整数的数组。您可以在x 上安全地使用sizeof

void foo(int & x[100]); // error

这被解析为“引用数组”——这是不合法的。

【讨论】:

  • 为什么我们不能有一个引用数组,例如int a, b, c; int arr[3] = {a, b, c};?
  • 啊哈,发现why
  • 有人能解释一下为什么void foo(int & x[100]); 被解析为“引用数组”吗?是因为“从右到左”的规则吗?如果是,它似乎与 void foo(int (&x)[100]); 被解析为“对数组的引用”的方式不一致。提前致谢。
  • 不是从右到左,而是从里到外,[] 比 & 绑定得更紧。
【解决方案2】:

这只是必需的语法:

void Func(int (&myArray)[100])

^ 通过引用传递 100 个数组 int 参数名称为 myArray;

void Func(int* myArray)

^ 传递一个数组。数组衰减为指针。因此,您会丢失尺寸信息。

void Func(int (*myFunc)(double))

^ 传递一个函数指针。该函数返回一个int 并接受一个double。参数名称为myFunc

【讨论】:

  • 我们如何传递可变大小的数组作为参考?
  • @ShivamArora 您将函数模板化并将大小作为模板参数。
【解决方案3】:

这是一种语法。在函数参数int (&myArray)[100] 括起来&myArray 的括号是必要的。如果您不使用它们,您将传递一个array of references,这是因为subscript operator [] 的优先级高于& operator

例如int &myArray[100] // array of references

因此,通过使用type construction (),您可以告诉编译器您想要一个包含 100 个整数的数组的引用。

例如int (&myArray)[100] // reference of an array of 100 ints

【讨论】:

  • "如果你不使用它们,你将传递一个array of references" - 当然,它不存在,所以你会得到一个编译错误。令我感到有趣的是,运算符优先级规则坚持无论如何都必须默认发生。
  • 还有关于类型构造()的教程吗?
  • 谢谢,我需要一个解释,其中包含运算符优先级的原因,这说明为什么应该这样做。
【解决方案4】:

以下创建一个泛型函数,通过引用获取任意大小和任意类型的数组:

template<typename T, std::size_t S>
void my_func(T (&arr)[S]) {
   // do stuff
}

play with the code.

【解决方案5】:

数组默认通过指针传递。您可以尝试在函数调用中修改数组以便更好地理解。

【讨论】:

  • 数组不能按值传递。如果函数接收到一个指针,则数组衰减为指向其第一个元素的指针。我不确定你想在这里说什么。
  • @UlrichEckhardt 我想说“数组不能按值传递”,正如您之前所说,它们默认通过引用传递
  • 数组既不是值传递也不是引用传递。它们通过指针传递。如果数组默认通过引用传递,那么在它们上使用 sizeof 就没有问题。但事实并非如此。数组传入函数时会衰减为指针。
  • 数组可以通过引用或降级为指针传递。例如,使用char arr[1]; foo(char arr[]).,arr 降级为指针;使用char arr[1]; foo(char (&amp;arr)[1]) 时,arr 作为引用传递。值得注意的是,由于维度丢失,前一种形式通常被认为是病态的。
  • Re,“数组是...通过指针传递的。”这种描述充其量听起来不合常规,新手可能会感到困惑。数组变量的 name 是一个有效的表达式,其值是指向数组第一个成员的指针。如果你有一些函数foo(T* t),并且你有一个数组T a[N];,那么当你写foo(a);时,我认为说你正在传递一个指针而不是传递一个数组会更正确,你正在传递按值指针。
猜你喜欢
  • 2020-07-30
  • 2012-04-17
  • 2014-08-06
  • 2020-03-09
  • 2019-06-29
  • 2015-07-04
  • 2011-05-24
相关资源
最近更新 更多