为什么这两行打印不同的地址?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());
这个地址的值是相同的,但地址本身是不同的。 这是否意味着有两个相同数组的副本?
编辑:在调试模式下它打印不同的地址,在释放模式有相同地址:)
为什么这两行打印不同的地址?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());
这个地址的值是相同的,但地址本身是不同的。 这是否意味着有两个相同数组的副本?
编辑:在调试模式下它打印不同的地址,在释放模式有相同地址:)
v1.begin()
返回std::vector<int>::iterator
,这不一定是一个地址v1[0]
。事实上,试图将其打印出来使用printf
给我一个警告:
警告:格式使用“%p”预计类型“无效*”,但争论3的参数的类型为“STD: :矢量:: iterator`
除非你确信你的特定标准库实现,并与当前的编译选项std::vector<int>::iterator
是int*
的别名,比较是没有意义的。
用于向量对象V1:
&V[0]
是对象V1的第一个元素的地址。
当我们创建一个迭代器例如vector<>::iterator iter
时iter
本身就是另一个对象,如在这个document中解释的那样。
迭代:可与++递增一个指针状物体, 解除引用带*,以及对与另一迭代相比=!
我希望本参考手册能够详细回答您的问题。
谢谢,现在更清楚了,'&(* v1.begin()'和'&v1 [0]'打印相同的地址。 –
@ Person.Junkie但是,这与你在问题中不一样。 – deviantfan