C ++通过引用传递一个数组

这是否允许通过引用传递数组?

void foo(double& *bar) 

似乎我的编译器说不。 为什么? 什么是通过引用传递数组的正确方法? 还是一个工作? 我有一个数组参数,我的方法应该修改,我应该后来检索。 另外,我可以使这个数组成为一个类的成员,这工作正常,但它有其他部分我的代码(我想避免)的许多缺点。

感谢致敬。

实际上,数组只能通过引用传递:

 void foo(double (&bar)[10]) { } 

这可以防止你做这样的事情:

 double arr[20]; foo(arr); // won't compile 

为了能够将任意大小的数组传递给foo ,使其成为模板并在编译时捕获数组的大小:

 template<typename T, size_t N> void foo(T (&bar)[N]) { // use N here } 

你应该认真考虑使用std::vector ,或者如果你有一个支持c ++ 11, std::array的编译器。

是的,但是当参数匹配引用时,隐式数组指针不是自动的,所以你需要像这样的东西:

 void foo( double (&array)[42] ); 

要么

 void foo( double (&array)[] ); 

但请注意,匹配时, double [42]double []是不同的types。 如果你有一个未知维的数组,它将匹配第二个,但不是第一个,如果你有一个42个元素的数组,它将匹配第一个, 但不是第二个 。 (后者是,恕我直言,非常直观。)

在第二种情况下,您还必须传递维度,因为一旦进入函数,就无法恢复它。

如果你想修改只是元素:

 void foo(double *bar); 

足够。

如果你想修改地址(例如: realloc ),但是它不适用于数组:

 void foo(double *&bar); 

是正确的forms。

当你使用C ++时,这里仍然缺less的强制性build议是使用std::vector<double>

你可以很容易地通过引用:

 void foo(std::vector<double>& bar) {} 

如果你有C ++ 11的支持,也可以看看std::array

以供参考:

就像其他答案一样,把&放在*

这提出了一个有趣的观点,有时候会让人困惑:types应该从右到左读。 例如,这是(从最右边的* )指向指向int的常量指针的指针。

 int * const *x; 

因此,您所写的内容将成为参考的指针,这是不可能的。

8.3.5.8如果参数的types包含“T的未知边界的数组的指针”或“T的未知边界的数组的引用”forms的types,则该程序是不合格的