这是否允许通过引用传递数组?
void foo(double& *bar)
似乎我的编译器说不。为什么?通过引用传递数组的正确方法是什么?还是变通?我有一个数组参数,我的方法应该修改它,然后我应该检索它。或者,我可以使这个数组成为一个类成员,它工作得很好,但它对我的代码的其他部分有很多缺点(我想避免)。
谢谢并恭祝安康。
这是否允许通过引用传递数组?
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 []
是不同的类型。如果您有一个未知维度的数组,它将匹配第二个,但不匹配第一个,如果您有一个包含 42 个元素的数组,它将匹配第一个但不匹配第二个。(后者是,恕我直言,非常违反直觉。)
在第二种情况下,您还必须传递维度,因为一旦您进入函数内部,就无法恢复它。
当您使用 C++ 时,这里仍然缺少的强制性建议是使用std::vector<double>
.
您可以通过引用轻松地传递它:
void foo(std::vector<double>& bar) {}
如果你有 C++11 支持,也可以看看std::array
.
以供参考:
如果您只想修改元素:
void foo(double *bar);
足够。
如果要将地址修改为(例如:)realloc
,但它不适用于数组:
void foo(double *&bar);
是正确的形式。
8.3.5.8 如果参数的类型包括“指向 T 的未知边界数组的指针”或“对 T 的未知边界数组的引用”形式的类型,则程序非良构
就像另一个答案说的那样,&
把*
.
这带来了一个有趣的点,有时可能会令人困惑:类型应该从右到左阅读。例如,这是(从最右边开始*
)指向一个指向 int 的常量指针的指针。
int * const *x;
因此,您编写的内容将是指向引用的指针,这是不可能的。
在这里,Erik 解释了通过引用传递数组的各种方式:https ://stackoverflow.com/a/5724184/5090928 。
同样,您可以像这样创建数组引用变量:
int arr1[] = {1, 2, 3, 4, 5};
int(&arr2)[5] = arr1;