能否通过引用传递数组?
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
。
foo
函数中,数组会衰变成指针。不,它不会,因为你只能传递一个有10个元素的数组,你不需要更多关于大小的信息。再次强调,你不能将数组作为参数传递到 void foo( double*& )
函数中;隐式转换的结果是一个右值,不能用来初始化非 const 引用。你必须使用 void foo( double *const & );
。 - James Kanzevoid foo(T &bar[N])
- 但实际上这意味着“引用数组”,而不是“数组引用”。 - OLLstd::vector
,你该如何将向量的内容(可能通过std::vector::data()
获得)转换为此数组类型?在类型参数中使用固定数组大小的语法是什么(即用于static_cast<>
)? - davidAreinterpret_cast
中允许将动态分配的数组(在分配后没有固有大小)视为具有固定大小的自动数组。此外,这是错误的问题:正确的问题应该是“如何重构我的代码以适用于两种类型的容器?”,答案是模板和迭代器/范围,或者由于您说大小是固定的,一个只接受数据指针/引用并硬编码大小的函数(如果大小可能变化,则使用数据/大小适配器,例如span
)。 - underscore_d可以,但是当引用进行参数匹配时,隐式将数组转换为指针是不自动进行的,因此您需要像这样使用:
void foo( double (&array)[42] );
或者void foo( double (&array)[] );
需要注意的是,在匹配类型时,double [42]
和 double []
是不同的类型。如果你有一个未知维度的数组,它将与第二个匹配,但不会与第一个匹配;如果你有一个有42个元素的数组,它将与第一个匹配,但不会与第二个匹配(后者在我看来非常违反直觉)。
在第二种情况中,你还必须传递维度,因为一旦进入函数,就没有办法恢复它。
double []
和double [42]
是两种不同的类型。因此,你只能传递一个长度未知的数组,例如extern double d[];
或类似的方式。这严重限制了它的可用性。) - James Kanze由于您正在使用C++,这里还缺少的必要建议是使用std :: vector<double>
。
您可以轻松地通过引用传递它:
void foo(std::vector<double>& bar) {}
如果你的项目支持C++11,也可以考虑使用std::array
。
参考链接:
std::vector
通常是最好的解决方案。但也有例外情况。 - James Kanze如果您只想修改元素:
void foo(double *bar);
足够了。
如果您想修改地址以使用(例如:realloc
),但对于数组不起作用:
void foo(double *&bar);
这是正确的表单。
这里,Erik解释了所有以引用方式传递数组的方法:https://dev59.com/02025IYBdhLWcg3w6aUX#5724184。
同样地,你可以像这样创建一个数组引用变量:
int arr1[] = {1, 2, 3, 4, 5};
int(&arr2)[5] = arr1;
*
后面加上&
。*
开始)指向int的常量指针。int * const *x;
8.3.5.8 如果参数的类型包括形式为“指向未知界限的T数组的指针”或“未知边界的T数组的引用”的类型,则程序不良形式
std::vector
或类似的容器吗? - moooeeeepstd::vector
显然更优越,但在大小始终相同的情况下,使用std::array
会更好,因为它可以解决语法上的丑陋问题,同时也赋予了值语义。 - underscore_d