在C++中传递数组作为函数参数的方法

Methods of passing an array as a function parameter in C++

本文关键字:函数 参数 方法 数组 C++      更新时间:2023-10-16

当作为参数传递到函数中时,只传递指向数组第一个元素的指针。我找到了一个临时的解决方法:

int function(int array[], int size) {
int otherArray[50]; // high enough number
for (int i = 0; i < size; i++) {
otherArray[i] = array[i];
}
// use otherArray
}

有没有一种更高效、更简洁的方法来传递整个数组?这似乎效率极低。

编辑:通过对我的数据使用std::vector,并使用&vec[0]以检索数组。

不能将数组传递给函数。你可以选择近似它:

  • 对原始数组的引用
  • std::数组
  • std::矢量

为了获得最大效率,您不希望复制数组。这就是数组首先会衰减为指针的原因(尽管它是从C继承而来的,并且有更好的方法来实现相同或类似的行为,这样更安全。(如果你想保持类型不衰减,你必须传递对数组或包含这样一个数组的对象的引用。

// pass reference to a raw array (Array of N elements of type T)
template <typename T, int N>
void foo1(T(&arrayArg)[N])
{
std::cout << arrayArg[0] << "n";
}

考虑到你最初在问题中使用的代码,我怀疑上面就是你想要的。然而,也要考虑其他选择,因为数组在c++中不是一种非常健壮的数据类型,并且对于通用代码有更好的选择。

// pass reference to std::array
template <typename T, int N>
void foo2(std::array<N, T> const & arrayArg)
{
std::cout << arrayArg[0] << "n";
}

std::array是一个下面包含原始数组的类,但它有一个更友好的C++接口,并且不受衰减的影响。

// pass reference to std::vector
template <typename T>  
void foo2(std::vector<T> const & vecArg)
{
std::cout << vecArg[0] << "n";
}

Vector是动态调整大小的,并且离您开始使用的原始数组越来越远,但它是许多c++数据结构和算法的构建块,在大多数情况下应该是您首先考虑的事情之一。

有一种历史方法可以使用结构将数组按值传递给函数,幸运的是,在c++中有std::array这样的集合,可以按值传递。

你可以在这里阅读更多关于C方式的内容。