C 迭代器(指针)
// This creates an array with 5 values.
const int array[] = { 1, 2, 3, 4, 5 };
#ifdef BEFORE_CPP11
// You can use `sizeof` to determine how many elements are in an array.
const int* first = array;
const int* afterLast = first + sizeof(array) / sizeof(array[0]);
// Then you can iterate over the array by incrementing a pointer until
// it reaches past the end of our array.
for (const int* i = first; i < afterLast; ++i) {
std::cout << *i << std::endl;
}
#else
// With C++11, you can let the STL compute the start and end iterators:
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]);
这些行创建了两个指针。第一个指针给出数组指针的值,该指针是数组中第一个元素的地址。在 C 数组上使用时,sizeof
运算符以字节为单位返回数组的大小。除以元素的大小,这给出了数组中元素的数量。我们可以用它来查找数组后块的地址。
for (const int* i = first; i < afterLast; ++i) {
这里我们创建一个指针,我们将它用作迭代器。它用我们想要迭代的第一个元素的地址初始化,只要 i
小于 afterLast
,我们就会继续迭代,这意味着只要 i
指向 array
中的一个地址。
std::cout << *i << std::endl;
最后,在循环中,我们可以通过解除引用来访问我们的迭代器 i
所指向的值。这里取消引用运算符*
返回 i
中地址的值。