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

时间:2018-07-30 21:23:05

标签: c++ arrays function parameters

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

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

2 个答案:

答案 0 :(得分:0)

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

  • 对原始数组的引用
  • std :: array
  • std :: vector

为获得最大效率,您不想复制阵列。这就是为什么数组首先衰减到指针的原因(尽管它是从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";
}

向量是动态调整大小的,并且与您开始使用的原始数组之间的距离越来越远,但是它是许多c ++数据结构和算法的基础,并且应该是大多数情况下首先要考虑的内容之一。 / p>

答案 1 :(得分:-1)

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

您可以了解有关C方式here的更多信息。