我在C ++中使用vector的数据方法,但是有一些问题,代码在下面:
#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
,但是为什么结果不是myvector contains: 10 20 100 0 0
,第一个*p = 10;
是10,第二个++p;*p = 20;
是20,没关系,但是第三个p[2] = 100;
应该是100,但是应该是0,为什么?
答案 0 :(得分:3)
具有视觉效果:
std::vector<int> myvector (5);
// ---------------------
// | 0 | 0 | 0 | 0 | 0 |
// ---------------------
int* p = myvector.data();
// ---------------------
// | 0 | 0 | 0 | 0 | 0 |
// ---------------------
// ^
// p
*p = 10;
// ----------------------
// | 10 | 0 | 0 | 0 | 0 |
// ----------------------
// ^
// p
++p;
// ----------------------
// | 10 | 0 | 0 | 0 | 0 |
// ----------------------
// ^
// p
*p = 20;
// ----------------------
// | 10 | 20 | 0 | 0 | 0 |
// ----------------------
// ^
// p
p[2] = 100;
// -------------------------
// | 10 | 20 | 0 | 100 | 0 |
// -------------------------
// ^ ^
// p p[2]
记住p[2]
是说*(p + 2)
的一种较短方法是很有帮助的。
答案 1 :(得分:1)
因为您正在修改p
本身。
在++p
之后(我记得您相当于p = p + 1
)之后,p
指向索引为1
的元素,因此p[2]
指向元素的索引从向量的开头开始在索引3
处,这就是为什么要更改第四个元素的原因。
答案 2 :(得分:1)
在++p
之后,指针p
指向myvector [1]。
那么我们有:
p[0]
指向myvector[1]
p[1]
指向myvector[2]
p[2]
指向myvector[3]