我在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
的地址每次都会增加?
答案 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;
迭代器不一定是指针,它只是一些对象重载必要的操作符,使其有点像指针(至少*
,++
和==
,尽管有时也是其他人)。同样的事情仍然适用,增加对象(或除了销毁它之外的任何其他操作)都不会改变对象的地址。