C++ C迭代器(指针)

示例

// 这将创建一个具有5个值的数组。
const int array[] = { 1, 2, 3, 4, 5 };

#ifdef BEFORE_CPP11

// 您可以使用`sizeof`来确定一个数组中有多少个元素。
const int* first = array;
const int* afterLast = first + sizeof(array) / sizeof(array[0]);

// 然后,您可以通过增加指针直到遍历数组
// 它超过了数组的末尾。
for (const int* i = first; i < afterLast; ++i) {
    std::cout << *i << std::endl;
}

#else

// 使用C ++ 11,您可以让STL计算开始和结束迭代器:
for (auto i = std::begin(array); i != std::end(array); ++i) {
    std::cout << *i << std::endl;
}

#endif

此代码将输出数字1到5,如下所示:

1
2
3
4
5

分解

const int array[] = { 1, 2, 3, 4, 5 };

这行代码将创建一个包含5个值的新整数数组。C数组只是指向内存的指针,每个值都存储在一个连续的块中。

const int* first = array;
const int* afterLast = first + sizeof(array) / sizeof(array[0]);

这些行创建两个指针。第一个指针被赋予数组指针的值,该值是数组中第一个元素的地址。sizeof在C数组上使用时,运算符返回以字节为单位的数组大小。除以元素的大小,得出数组中元素的数量。我们可以使用它来找到数组的块的地址。

for (const int* i = first; i < afterLast; ++i) {

在这里,我们创建一个指针,将其用作迭代器。它会使用我们要迭代的第一个元素的地址进行初始化,只要i小于,我们将继续迭代afterLast,这意味着只要i指向内的地址即可array。

    std::cout << *i << std::endl;

最后,在循环中,我们可以i通过取消引用来访问迭代器指向的值。在此,取消引用运算符*将返回位于中地址的值i。