数组作为参数

Array as parameter

本文关键字:参数 数组      更新时间:2023-10-16

当我将数组作为参数传递时,我想知道其中哪一个是最好的?

void function(int arr[]) {...};

void function(int* arr) {...};

你能告诉我你的原因吗?你可以参考哪本书?谢谢

由于这个问题被标记为c++,所以我两者都不使用。如果必须使用此选项,则两者等效。

但是,由于您使用C++,因此更好的方法是使用std::vector来执行此类任务

void function(std::vector<int> &arr) {...}

或者,如果你不修改阵列/矢量

void function(const std::vector<int> &arr) {...}

如果您只想传递任何数组(包括动态分配的),它们是等价的。

如果你的函数需要一个实际的固定大小的数组,你可以这样做:

template <size_t N>
void function(char (&str)[N]) { ... }

它们在语义上是相同的。

#1稍微好一点(在我看来),因为它明确表示您正在传递一个数组。

您询问选择

void function(int arr[]) {...};

void function(int* arr) {...};

后者允许您将指针本身声明为const,而前者仅允许您将项声明为const。然而,对于读取器来说,[]指示一个数组,而不是可能指向单个对象的指针。我个人认为const提供的约束比[]提供的阵列度指示更实用。

对于更高级别的代码,请使用std::vectorstd::array,以更合适的为准。

将数组作为参数传递的最佳方式实际上是:

void function(type_t* array, int amountOfElts, int arrayAllocatedElts);

在某些情况下(比如传递字符串时),您通常可以跳过这两个参数。但无论哪种方式,它们都可能有用,例如在对字符串执行某些操作时,或者它们可能会为您保存一两个strlen调用。

在我看来,在函数参数中使用[]选项是令人困惑的,应该避免。但我不认为这是惯例。

根据您想要提供的抽象层,您应该在Olaf的方法或STL在很大程度上使用的方法之间进行选择:

template <class Iter>
void function(Iter first, Iter last)
{
    // for example, to get size:
    std::size_t size = std::distance(first, last);
    // for example, to iterate:
    for ( Iter it = first; it != last; ++it )
    {
        // *it to get the value, like:
        std::cout << *it << std::endl;
    }
}

这样,您不仅可以将该函数用于数组,还可以将其用于各种STL类型:向量、列表、队列、堆栈等等

int tab[4] = {1,2,3,4};
function(tab, tab+4);
std::vector<int> vec;
// fill vector with something
function(vec.begin(), vec.end());