C ++中迭代器的指针如何在循环中改变?

时间:2013-09-06 19:05:39

标签: c++ loops pointers iterator

我在C ++中玩vector s,我发现了这个问题,我很困惑......

#include <vector>
#include <cstdio>
using namespace std;

int main()
{
  vector<int> v;
  v.push_back(1);
  v.push_back(2);
  v.push_back(3);

  for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
  {
    printf("At: %p, %i\n", &it, *it);
  }
}

我确实运行了这个程序

g++ -Wall soquestion.cpp -o soquestion
./soquestion

输出

At: 0x7fff59c80a98, 1
At: 0x7fff59c80a98, 2
At: 0x7fff59c80a98, 3

但我认为it的地址每次都会增加?

5 个答案:

答案 0 :(得分:4)

printf("At: %p, %i\n", &*it, *it);

这将告诉你我想你想要什么。向量中所选对象的地址,后跟向量中所选对象的值。就像duffymo所说,以前你引用的是实际的it对象本身,而不是它所指向的对象。

答案 1 :(得分:2)

我会将第一个值解释为对内存中迭代器对象的引用,这不会改变。一旦实例化,对象引用就是常量。

第二个值是向量的索引,它是递增的。它是迭代器本身内部的私有数据成员,它是递增的,而不是迭代器对象。

我不相信你正确地考虑了迭代器对象。

答案 2 :(得分:2)

指针迭代器对象,即it保持放置,&it的输出很好地证明了这一点。但是,指针或迭代器的值会增加,从而导致引用序列中的下一个值。这由*it显示。

如果要查看指针/迭代器实际指向的位置,可以使用&*it。如果已知it是指针,则可以直接打印it

std::cout << "&it=" << &it << " "
    "obj=" << &*it << " "
    "value=" << *it << "\n";

答案 3 :(得分:1)

迭代器地址在当前范围内保持固定

我想你可能想要这个:

printf("At: %p, %i\n", &*it, *it);

答案 4 :(得分:1)

增加任何对象(甚至指针)不会更改该对象的地址。如果它是一个指针,递增它会改变它指向的地址,但指针本身的地址仍然是相同的。例如,在此代码中,相同的地址(b的地址)打印两次。

int a;
int* b = &a;
std::cout << &b << std::endl;
++b;
std::cout << &b << std::endl;

迭代器不一定是指针,它只是一些对象重载必要的操作符,使其有点像指针(至少*++==,尽管有时也是其他人)。同样的事情仍然适用,增加对象(或除了销毁它之外的任何其他操作)都不会改变对象的地址。