首页 > 解决方案 > 在 C++ 中将数组作为函数参数传递的方法

问题描述

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

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] 检索数组来解决。

标签: c++arraysfunctionparameters

解决方案


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

  • 对原始数组的引用
  • 标准::数组
  • 标准::向量

为了获得最大效率,您不想复制数组。这就是为什么数组首先衰减为指针的原因(尽管它是从 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++ 数据结构和算法的构建块,在大多数情况下应该是您首先考虑的事情之一。


推荐阅读