是否允许通过引用传递数组?
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的数组元素,它将匹配第一个但不匹配第二个。 (后者是,恕我直言,非常违反直觉。)
在第二种情况下,您还必须传递尺寸,因为一旦进入函数,就无法恢复。
如果只想修改元素:
void foo(double *bar);
足够。
如果您要将地址修改为(例如:realloc
),但不适用于数组:
void foo(double *&bar);
是正确的格式。
当您使用C ++时,这里仍然缺少的强制性建议是使用std::vector<double>
。
您可以通过引用轻松通过它:
void foo(std::vector<double>& bar) {}
如果您有C ++ 11支持,也请参阅std::array
。
供参考:
8.3.5.8如果参数的类型包括“指向T的未知边界数组的指针”或“引用到T的未知边界数组,”程序格式不正确
[就像另一个答案说的那样,将&
放在*
之后。
这提出了一个有趣的观点,有时可能会造成混淆:应该从右到左读取类型。例如,这是(从最右边的*
开始)一个指向int的常量指针的指针。
int * const *x;
因此,您写的将是指向引用的指针,这是不可能的。
这里,Erik解释了每种方式通过引用传递数组:https://stackoverflow.com/a/5724184/5090928。
类似地,您可以像这样创建array reference variable:
int arr1[] = {1, 2, 3, 4, 5};
int(&arr2)[5] = arr1;