88

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

 void foo(double& *bar) 

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

谢谢并恭祝安康。

4

7 回答 7

152

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

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.

于 2012-04-04T09:27:13.173 回答
18

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

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

或者

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

但是请注意,在匹配时,double [42]double []是不同的类型。如果您有一个未知维度的数组,它将匹配第二个,但不匹配第一个,如果您有一个包含 42 个元素的数组,它将匹配第一个但不匹配第二个。(后者是,恕我直言,非常违反直觉。)

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

于 2012-04-04T09:25:19.307 回答
8

当您使用 C++ 时,这里仍然缺少的强制性建议是使用std::vector<double>.

您可以通过引用轻松地传递它:

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

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

以供参考:

于 2012-04-04T09:12:58.730 回答
6

如果您只想修改元素:

void foo(double *bar);

足够。

如果要将地址修改为(例如:)realloc,但它不适用于数组:

void foo(double *&bar);

是正确的形式。

于 2012-04-04T09:03:37.043 回答
3

8.3.5.8 如果参数的类型包括“指向 T 的未知边界数组的指针”或“对 T 的未知边界数组的引用”形式的类型,则程序非良构

于 2014-07-18T15:05:16.780 回答
2

就像另一个答案说的那样,&*.

这带来了一个有趣的点,有时可能会令人困惑:类型应该从右到左阅读。例如,这是(从最右边开始*)指向一个指向 int 的常量指针的指针。

int * const *x;

因此,您编写的内容将是指向引用的指针,这是不可能的。

于 2012-04-04T09:07:22.567 回答
1

在这里,Erik 解释了通过引用传递数组的各种方式:https ://stackoverflow.com/a/5724184/5090928 。

同样,您可以像这样创建数组引用变量

int arr1[] = {1, 2, 3, 4, 5};
int(&arr2)[5] = arr1;
于 2019-11-25T02:49:21.310 回答