当我将数组作为参数传递时,我想知道其中哪一个是最好的?
void function(int arr[]) {...};
或者
void function(int* arr) {...};
你能告诉我你的理由吗?你可能会参考哪本书?谢谢!
当我将数组作为参数传递时,我想知道其中哪一个是最好的?
void function(int arr[]) {...};
或者
void function(int* arr) {...};
你能告诉我你的理由吗?你可能会参考哪本书?谢谢!
由于这个问题被标记为c++,所以我都不会使用。如果你必须使用它,两者都是等价的。
但是由于您使用 C++,因此更好的方法是使用 astd::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::vector
或std::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());