我想在函数内迭代一个数组。以下代码不会编译。
void printArr(int arr[])
{
for (auto x : arr)
{
cout << x << endl;
}
}
我知道arr实际上是指向第一个元素的指针。 谢谢你的帮助。
答案 0 :(得分:4)
原因是基于范围的循环需要数组类型,标准库容器或具有合适begin
和end
迭代器的东西。在您的函数中,arr
只是一个指针(函数参数,例如int arr[]
已调整为int* arr
)。
从实际角度来看,基于范围的循环无法知道要打印多少个元素,因此处理指针是没有意义的。
您可以尝试通过引用传递数组。
template <size_t N>
void printArr(const int (&arr)[N])
{
for (auto x : arr)
{
cout << x << endl;
}
}
使用模板函数来允许不同长度的数组。您还可以将元素类型设置为模板参数:
template <typename T, size_t N>
void printArr(const T (&arr)[N])
{
....
答案 1 :(得分:1)
这是因为数组参数已耗尽指针,而基于范围的循环需要数组或容器类型。您可以尝试以下代码:
template <typename T, size_t sz>
void printArr(const T (&arr)[sz])
{
for (auto x : arr)
{
cout << x << endl;
}
}
此代码传递数组的引用而不是地址。