使用 std::vector::data() 访问元素

问题描述 投票:0回答:2

对于这段代码

#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector (5);

  int* p = myvector.data();

  *p = 10;
  ++p;
  *p = 20;
  p[2] = 100;

  std::cout << "myvector contains:";
  for (unsigned i=0; i<myvector.size(); ++i)
    std::cout << ' ' << myvector[i];
  std::cout << '\n';

  return 0;
}

生成

myvector contains: 10 20 0 100 0

问题是为什么

p[2]
是0?假设
myvector.data()
是指向第一个元素(索引 0)的指针,那么
p[0]
就是 10,这很好。
++p
指向下一个元素
p[1]
,即 20,也可以。现在,
p[2]
p[1]
之后的下一个元素。所以,顺序应该是
10 20 100
。这里有什么错误吗?

c++ pointers vector
2个回答
4
投票

您将

p
加 1,然后写入
p[2]
,现在实际上是
myvector[3]

写入

p[1]
将写入与
*p
相邻的字段。


1
投票

您将指针

p
初始化为指向
myvector[0]

然后递增

p
,所以现在它指向
myvector[1]

如果我们把它画出来,那就是这样的:

+-------------+-------------+-------------+-------- -------+-------------+
|我的矢量[0] |我的矢量[1] |我的矢量[2] |我的向量[3] |我的矢量[4] |
+-------------+-------------+-------------+-------- ------+-------------+
                ^
                |
                p

现在是重要的部分:对于任何指针或数组

p
和索引
i
,表达式
p[i]
完全等于
*(p + i)

这意味着代码中的

p[2]
*(p + 2)
相同。由于
p
指向向量的第二个元素,因此
p + 2
将指向第四个元素。

再次把它画出来:

+-------------+-------------+-------------+-------- -------+-------------+
|我的矢量[0] |我的矢量[1] |我的矢量[2] |我的向量[3] |我的矢量[4] |
+-------------+-------------+-------------+-------- ------+-------------+
                ^^^^
                | | | |
                p p + 1 p + 2 p + 3

因此,当您写入

p[2]
时,就与写入
myvector[3]
相同。

© www.soinside.com 2019 - 2024. All rights reserved.