带指针的基于范围的循环

时间:2014-11-26 07:36:33

标签: c++ arrays loops

我想在函数内迭代一个数组。以下代码不会编译。

void printArr(int arr[])
{
    for (auto x : arr)
    {
        cout << x << endl;
    }
}

我知道arr实际上是指向第一个元素的指针。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:4)

原因是基于范围的循环需要数组类型,标准库容器或具有合适beginend迭代器的东西。在您的函数中,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;
    }
}

Live demo here

此代码传递数组的引用而不是地址。