对于这段代码
#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
。这里有什么错误吗?
您将
p
加 1,然后写入 p[2]
,现在实际上是 myvector[3]
。
写入
p[1]
将写入与 *p
相邻的字段。
您将指针
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]
相同。