数组作为参数
Array as parameter
当我将数组作为参数传递时,我想知道其中哪一个是最好的?
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::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());
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
- 估计函数参数数组的维度
- 温度参数数组的内存泄漏
- 如何将值附加到命令行参数数组?
- libpqxx:如何绑定参数数组
- 如何在德尔福中C++参数数组指针算术
- C++函数参数或参数数组
- 将 std::function 代理为需要参数数组的 C 函数
- 分析字符串参数数组
- Pro*C传递参数数组
- OpenCV错误:cvGetSize中的错误参数(数组应该是CvMat或IplImage)
- c++无限参数数组
- 查找命令行参数数组中的元素数
- 如何将目录中所有具有完整路径的文件传递到execv中的参数数组
- ODBC:参数数组-忽略参数
- 使用lambda参数数组