C ++通过引用传递数组

问题描述 投票:62回答:7

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

 void foo(double& *bar) 

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

感谢和问候。

c++ arrays pointers reference pass-by-reference
7个回答
106
投票

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

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


14
投票

是,但是当参数匹配引用时,隐式数组将指针不是自动的,因此您需要类似以下内容:

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

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

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

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


6
投票

如果只想修改元素:

void foo(double *bar);

足够。

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

void foo(double *&bar);

是正确的格式。


6
投票

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

您可以通过引用轻松通过它:

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

如果您有C ++ 11支持,也请参阅std::array

供参考:


3
投票

8.3.5.8如果参数的类型包括“指向T的未知边界数组的指针”或“引用到T的未知边界数组,”程序格式不正确


2
投票

[就像另一个答案说的那样,将&放在*之后。

这提出了一个有趣的观点,有时可能会造成混淆:应该从右到左读取类型。例如,这是(从最右边的*开始)一个指向int的常量指针的指针。

int * const *x;

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


0
投票

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

类似地,您可以像这样创建array reference variable

int arr1[] = {1, 2, 3, 4, 5};
int(&arr2)[5] = arr1;
© www.soinside.com 2019 - 2024. All rights reserved.