2011-04-20 81 views
120

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

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

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

是否(&myArray)[100]有任何意义或它只是一个语法按引用传递任何阵列? 我不明白单独的括号后面跟着大括号。谢谢。

+0

是否有任何与函数参数的左值和右值的关系? – 2011-04-20 00:16:14

+0

可能的重复[什么是有用的数组引用参数?](http://stackoverflow.com/questions/2188991/what-is-useful-about-a-reference-to-array-parameter) – AnT 2011-04-20 00:25:59

+0

[有关引用数组参数的有用信息?](https://stackoverflow.com/questions/2188991/what-is-useful-about-a-reference-to-array-parameter) – anatolyg 2017-07-08 23:07:43

回答

162

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

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

这被解析为“中引用数组”安全使用sizeof

+0

为什么我们不能有一个引用数组例如'int a,b,c; int arr [3] = {a,b,c};'? – Vorac 2016-01-07 13:10:53

+4

啊哈,发现[为什么](http://stackoverflow.com/questions/1164266/why-arrays-of-references-are-illegal#1164306)。 – Vorac 2016-01-08 13:51:50

+1

有人可以解释为什么'void foo(int&x [100]);'被解析为“引用数组”?是因为“从右到左”的规则?如果是的话,它似乎不符合'void foo(int(&x)[100]);'被解析为“对数组的引用”。提前致谢。 – zl9394 2017-02-11 00:52:34

35

这只是所需的语法:

^通行证阵列100 int通过引用
void Func(int (&myArray)[100]) 

的参数的名称是myArray;

void Func(int* myArray) 

^传递数组。数组衰减到一个指针。因此你失去了尺寸信息。

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

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

+0

我们如何传递一个可变大小的数组作为参考? – 2017-06-29 08:07:50

+0

@ShivamArora您可以对函数进行模板化并将大小设置为模板参数。 – 2017-06-29 15:53:00

18

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

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

因此,通过使用type construction(),您告诉编译器您需要引用一个由100个整数组成的数组。

E.g int (&myArray)[100] // reference of an array of 100 ints

+0

“如果你不使用它们,你将会传递一个”引用数组“ - 当然,这是不可能存在的,所以你会得到一个编译错误。无论如何,运营商优先规则坚持认为这肯定会发生,这对我来说很有趣。 – 2016-08-30 15:27:47

+0

是否还有关于类型构造()的更多教程? – Iartist93 2016-12-01 19:32:46

+0

谢谢,我需要一个解释,其中包括关于运算符优先级的原因,这说明了为什么应该这样做。 – cram2208 2017-11-07 05:43:46

2

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

+1

数组无法按值传递。如果函数接收到一个指针,则数组会衰减到指向其第一个元素的指针。我不确定你在这里想说什么。 – 2015-07-19 08:50:24

+0

@UlrichEckhardt我想说的是,“数组无法通过值传递”,如前所述,它们默认通过引用传递 – 2015-07-24 21:52:30

+4

数组既没有被传递,也没有被传递。他们通过指针传递。如果数组默认情况下是通过引用传递的,那么使用sizeof就没有问题了。但事实并非如此。数组传递到函数时会衰减指针。 – user3437460 2016-05-27 16:43:36