kir*_*off 62 c++ arrays pointers reference pass-by-reference
这是允许通过引用传递数组?
void foo(double& *bar)
Run Code Online (Sandbox Code Playgroud)
似乎我的编译器说没有.为什么?通过引用传递数组的正确方法是什么?还是一个解决方法?我有一个数组参数,我的方法应该修改,然后我应该检索.或者,我可以使这个数组成为一个类成员,它工作正常,但它对我的代码的其他部分有很多缺点(我想避免).
感谢致敬.
jro*_*rok 106
数组只能通过引用传递,实际上:
void foo(double (&bar)[10])
{
}
Run Code Online (Sandbox Code Playgroud)
这可以防止你做以下事情:
double arr[20];
foo(arr); // won't compile
Run Code Online (Sandbox Code Playgroud)
为了能够传递任意大小的数组foo,使其成为模板并在编译时捕获数组的大小:
template<typename T, size_t N>
void foo(T (&bar)[N])
{
// use N here
}
Run Code Online (Sandbox Code Playgroud)
您应该认真考虑使用std::vector,或者如果您有一个支持c ++ 11的编译器,std::array.
Jam*_*nze 14
是的,但是当参数匹配引用时,指向的隐式数组不是自动的,所以你需要这样的东西:
void foo( double (&array)[42] );
Run Code Online (Sandbox Code Playgroud)
要么
void foo( double (&array)[] );
Run Code Online (Sandbox Code Playgroud)
请注意,但是,匹配时,double [42]并且double []是不同的类型.如果你有一个未知维度的数组,它将匹配第二个,但不匹配第一个,如果你有一个包含42个元素的数组,它将匹配第一个而不是第二个.(后者是,恕我直言,非常反直觉.)
在第二种情况下,您还必须传递维度,因为一旦您进入函数内部就无法恢复它.
如果您只想修改元素:
void foo(double *bar);
Run Code Online (Sandbox Code Playgroud)
足够.
如果要将地址修改为(例如:) realloc,但它不适用于数组:
void foo(double *&bar);
Run Code Online (Sandbox Code Playgroud)
是正确的形式.
当您使用C++时,这里仍然缺少的强制性建议是使用std::vector<double>.
您可以通过引用轻松传递它:
void foo(std::vector<double>& bar) {}
Run Code Online (Sandbox Code Playgroud)
如果你有C++ 11的支持,也可以看看std::array.
以供参考: