通过引用传递数组


184

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

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

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

是否(&myArray)[100]有任何含义或其只是通过引用传递任何数组的语法?我不明白在这里用大括号将其括起来。谢谢。


函数参数是否存在Rvalue与Lvalue的关系?
John DB


Answers:


228

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

编辑:一些澄清。

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

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

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

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

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

这被解析为“引用数组”,这是非法的。


为什么我们不能有一个引用数组,例如int a, b, c; int arr[3] = {a, b, c};
Vorac

4
啊哈,找出原因
Vorac

2
有人可以解释为什么void foo(int & x[100]);将其解析为“引用数组”吗?是因为“从右到左”规则吗?如果是,它似乎与如何void foo(int (&x)[100]);解析为“对数组的引用” 不一致。提前致谢。
zl9394

3
它不是从右到左,它是由内而外的,并且[]的绑定比&更紧密。
philipxy

48

这只是必需的语法:

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

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

void Func(int* myArray)

^传递数组。数组衰减到指针。因此,您丢失了尺寸信息。

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

^传递函数指针。该函数返回,int并采用double。参数名称为myFunc


我们如何传递可变大小的数组作为参考?
Shivam Arora

@ShivamArora您可以对函数进行模板化,并将大小作为模板参数。
马丁·约克

24

这是一种语法。在函数参数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“-当然不存在,因此会出现编译错误。让我感到有趣的是,运算符优先级规则坚持要求无论如何都必须默认进行。
underscore_d

关于类型构造()还有其他教程吗?
首席移徙者,2016年

谢谢,我需要一个解释,其中包括关于运算符优先级的原因,这使您可以理解为什么要采用这种方式。
cram2208

4

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


2
数组不能按值传递。如果函数接收到指针,则数组会衰减为指向其第一个元素的指针。我不确定您要在这里说些什么。
Ulrich Eckhardt

@UlrichEckhardt我想说的是“数组不能按值传递”,就像您之前所说的那样,它们默认是按引用传递的
Eduardo A.FernándezDíaz15年

8
数组既不通过值也不通过引用传递。它们由指针传递。如果默认情况下通过引用传递数组,则对它们使用sizeof不会有问题。但事实并非如此。数组在传递给函数时会衰减到指针。
user3437460

2
数组可以通过引用或降级为指针来传递。例如,使用char arr[1]; foo(char arr[]).,arr会降级为指针;使用时char arr[1]; foo(char (&arr)[1]),将arr作为参考传递。值得注意的是,由于失去了尺寸,前一种形式通常被认为是不正确的形式。
zl9394

Re,“数组...通过指针传递。” 这种描述充其量听起来听起来很不合常规,可能会使新手感到困惑。数组变量的名称是一个有效的表达式,其值是一个指向数组第一个成员的指针。如果您有一些函数foo(T* t),并且您有一个数组,T a[N];那么在编写时,foo(a);我认为将指针传递给指针,而不是数组传递给指针,并按值传递指针。
所罗门慢

1

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

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

玩代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.