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

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

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

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


当前回答

这只是必需的语法:

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

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

void Func(int* myArray)

传递一个数组。数组衰减为指针。这样就会丢失大小信息。

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

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

其他回答

它是一种语法。在函数参数int (&myArray)[100]中,必须用圆括号括起&myArray。如果您不使用它们,您将传递一个引用数组,这是因为下标操作符[]比&操作符具有更高的优先级。

例如int &myArray[100] //引用数组

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

例如int (&myArray)[100] // 100个int数组的引用

数组默认由指针传递。为了更好地理解,您可以尝试在函数调用中修改数组。

这只是必需的语法:

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

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

void Func(int* myArray)

传递一个数组。数组衰减为指针。这样就会丢失大小信息。

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

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

这是数组引用的语法——你需要使用(&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

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

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

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

玩一下代码。