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,则该程序是不合格的