2017-03-17 78 views
0

为什么这两行打印不同的地址?C++ vector.begin()和vector [0]

vector<int> v1{ 12,2,34 }; 
printf_s("%d - 0x%p\n", v1[0], &v1[0]); 
printf_s("%d - 0x%p\n",*v1.begin(), v1.begin()); 

这个地址的值是相同的,但地址本身是不同的。 这是否意味着有两个相同数组的副本?

编辑:在调试模式下它打印不同的地址,在释放模式有相同地址:)

回答

10

v1.begin()返回std::vector<int>::iterator,这不一定是一个地址v1[0]。事实上,试图将其打印出来使用printf给我一个警告:

警告:格式使用“%p”预计类型“无效*”,但争论3的参数的类型为“STD: :矢量:: iterator`

除非你确信你的特定标准库实现,并与当前的编译选项std::vector<int>::iteratorint*的别名,比较是没有意义的。

+1

谢谢,现在更清楚了,'&(* v1.begin()'和'&v1 [0]'打印相同的地址。 –

+1

@ Person.Junkie但是,这与你在问题中不一样。 – deviantfan

2

用于向量对象V1:

&V[0]是对象V1的第一个元素的地址。

当我们创建一个迭代器例如vector<>::iterator iteriter本身就是另一个对象,如在这个document中解释的那样。

迭代:可与++递增一个指针状物体, 解除引用带*,以及对与另一迭代相比=!

我希望本参考手册能够详细回答您的问题。