C ++ vector.begin()和vector [0]

时间:2017-03-17 11:05:01

标签: c++ vector

为什么这两行会打印不同的地址?

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());

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

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

2 个答案:

答案 0 :(得分:10)

std::vector<int>::iterator会返回v1[0]printf不一定是std::vector<int>::iterator的地址。实际上,尝试使用int*将其打印出来会给我一个警告:

  

警告:格式&#39;%p&#39; 期望类型为&#39; void *&#39; 的参数,但参数3的类型为<强>&#39;的std ::矢量:: iterator`

除非您确定在您的特定标准库实施中,并且当前的编译选项$qInsert = oci_parse($c1, " INSERT INTO TBLDATA(DATAID, DATAVALUE) SELECT DATAID_FK,$datavalue FROM TBLACCESSDATA "); $qInsert = oci_parse($c1, " INSERT INTO TBLDATA(DATAID, DATAVALUE) SELECT DATAID_FK,:datavalue FROM TBLACCESSDATA "); oci_bind_by_name($qInsert, ':datavalue', $datavalue, -1); 的别名,否则这种比较毫无意义。

答案 1 :(得分:2)

表示矢量对象v1:

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

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

  

Iterator:类似指针的对象,可以用++递增,   用*取消引用,并用另一个迭代器与!=。

进行比较

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