You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 17:53:10