带有指针的基于范围的循环

Range based loops with pointers

本文关键字:范围 循环 于范围 指针      更新时间:2023-10-16

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

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

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

原因是基于范围的循环需要数组类型、标准库容器或具有合适的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])
{
  ....

这是因为数组参数耗尽为指针,并且基于范围的循环需要数组或容器类型。您可以改为尝试以下代码:

template <typename T, size_t sz>
void printArr(const T (&arr)[sz])
{
    for (auto x : arr)
    {
        cout << x << endl;
    }
}

现场演示在这里

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