通过引用传递数组

Joh*_* DB 166 c++ arrays

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

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

int main()
{
    int a[100];
    foo(a);
}
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*rik 211

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

编辑:一些澄清.

void foo(int * x);
void foo(int x[100]);
void foo(int x[]);
Run Code Online (Sandbox Code Playgroud)

这三种是声明相同功能的不同方式.它们都被视为接受int *参数,您可以将任何大小的数组传递给它们.

void foo(int (&x)[100]);
Run Code Online (Sandbox Code Playgroud)

这只接受100个整数的数组.您可以放心地使用sizeofx

void foo(int & x[100]); // error
Run Code Online (Sandbox Code Playgroud)

这被解析为"引用数组" - 这是不合法的.

  • 啊哈,发现了[为什么](http://stackoverflow.com/questions/1164266/why-arrays-of-references-are-illegal#1164306). (4认同)
  • 这是不对的,它是内在的,[]比&更紧密. (3认同)
  • 有人可以解释为什么`void foo(int&x [100]);`被解析为"引用数组"了吗?是因为"从右到左"的规则?如果是,它似乎与`void foo(int(&x)[100]);`被解析为"对数组的引用"的方式不一致.提前致谢. (2认同)

Mar*_*ork 45

这只是必需的语法:

void Func(int (&myArray)[100])
Run Code Online (Sandbox Code Playgroud)

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

void Func(int* myArray)
Run Code Online (Sandbox Code Playgroud)

^传递一个数组.数组衰减为指针.因此,您丢失了大小信息.

void Func(int (*myFunc)(double))
Run Code Online (Sandbox Code Playgroud)

^传递函数指针.该函数返回一个int并取一个double.参数名称是myFunc.


cpx*_*cpx 21

这是一种语法.在函数参数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


Use*_*645 8

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

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

玩代码。

  • [关于如何使用此模式制作安全的 strcpy 的好文章](https://randomascii.wordpress.com/2013/04/03/stop-using-strncpy-already/)。 (2认同)

Edu*_*íaz 6

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

  • 数组既不是按值传递,也不是按引用传递。它们通过指针传递。如果默认情况下数组是通过引用传递的,那么对它们使用 sizeof 不会有问题。但事实并非如此。当传递给函数时,数组会衰减为指针。 (8认同)
  • 数组不能按值传递。如果函数接收指针,则数组将衰减为指向其第一个元素的指针。我不确定你在这里想说什么。 (3认同)
  • 数组可以通过引用传递,也可以通过降级为指针传递。例如,使用 `char arr[1]; foo(char arr[]).`, arr 降级为指针;使用“char arr[1]”时;foo(char (&amp;arr)[1])`, arr 作为引用传递。值得注意的是,前一种形式通常被认为是格式错误的,因为维度丢失了。 (3认同)