使用std::vector::data()访问元素时的指针索引疑问
关于std::vector::data()指针索引的疑问
代码示例
#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
疑问
为什么vector中对应p[2]的位置是0?我认为myvector.data()指向首元素(索引0),*p赋值为10后,++p指向索引1的元素并赋值为20,p[2]应该对应索引2的元素,预期序列应为10 20 100,请问我的理解哪里出错了?
解答
你的问题出在对指针索引的基准点理解有误:
- 初始时
p = myvector.data(),此时p指向vector的首元素(索引0),赋值*p = 10修改的是索引0的元素。 - 执行
++p后,p的位置已经移动到了vector的索引1处,赋值*p = 20修改的是索引1的元素。 - 此时
p[2]等价于*(p + 2),也就是从当前p的位置(索引1)向后偏移2个元素,最终指向的是vector的索引3的位置,而不是索引2。
所以p[2] = 100实际修改的是索引3的元素,这就是为什么输出里索引2保持初始值0,索引3变成100。
如果要修改索引2的元素,有两种方式:
- 在
++p之后使用p[1](从当前p的位置偏移1位); - 重新将p重置为
myvector.data(),再使用p[2]。
内容的提问来源于stack exchange,提问作者mahmood
相关产品推荐
相关产品推荐

