【问题标题】:Is vector in c++ a pointer?c++中的vector是指针吗?
【发布时间】:2020-11-23 07:21:22
【问题描述】:

假设我们有一个向量 v,我将它传递给函数 f

void f(vector<int> &v) {
    cout<<&v;
}

int main() {
    vector<int> v;
    v.push_back(10);  
    v.push_back(20);
    v.push_back(30);

    cout<<&v[0]<<"\n"<<&v<<"\n";
    f(v);
}

为此,我得到如下输出:

0x55c757b81300
0x7ffded6b8c70
0x7ffded6b8c70

我们可以看到&amp;v&amp;v[0] 有不同的地址。那么 v 是指向向量开头的指针吗?如果是这样,为什么我无法访问*v?是不是我做错了?

谢谢

【问题讨论】:

  • 为什么要这样访问它?这就是迭代器的用途。
  • 这是参考。他们的记忆位置。
  • vector 是一个模板,vector&lt;int&gt; 是一个类,v[0] 是一个 int。实现如何,甚至是否使用指针是一个内部细节,没有记录,也不能依赖。你为什么在乎?最后两行打印相同的地址是预期的,并且对所有引用类型参数都一样。
  • 对于std::vector 类型可以做什么或不能做什么,请查阅 C++ 标准、一本好书或例如cppreference.com。如果你很好奇,你也可以阅读std::vector 模板的源代码,尽管作为初学者有点难以理解。作为这里的新用户,从tour 开始阅读How to Ask
  • int *p = v.data(); cout&lt;&lt;p&lt;&lt;" "&lt;&lt;&amp;v[0] 将是相同的。 &amp;v 是向量对象的地址,&amp;v[0] 是底层数组的地址。

标签: c++ pointers vector


【解决方案1】:

c++中的vector是指针吗?

没有。 std::vector 不是指针。这是一门课。

那么 v 是指向向量开头的指针吗?

不,但是v(向量类的一个实例)恰好包含一个指向数组开头的指针。

为什么我无法访问*v

因为类 std::vector 的一元 operator* 没有重载。

【讨论】:

  • 那么如果我需要访问中间任何元素的地址是&amp;v[i]我唯一的方法?
  • @RishabBalasubramanian 您不需要使用 addressof 运算符来访问元素。此外,下标运算符不是访问元素的唯一方法。还有其他方法,例如使用指针或向量迭代器。
【解决方案2】:

std::vector 结构可能包含其他数据,例如长度。连续元素存储在单独的位置,并且该位置会随着数组大小的调整而改变。只要v 不移动,&amp;v 就应该保持不变,但由于多种原因,&amp;v[0] 可能会失效。

想象一下,粗略地说,它是:

struct vector {
  size_t size;
  T* elements;
};

当您使用 &amp;v[0] 时,operator[] 实现会接管。

它不是指针,它的行为与new[] 非常不同。

【讨论】:

  • 谢谢,我想我明白了。
【解决方案3】:

std::vector 是一个封装动态大小数组的序列容器。 所以肯定不是指针。

正如@tadman 所说,v(向量类的一个实例)恰好包含一个指向数组开头的指针。

您无法访问*v,因为std::vector 类的一元运算符* 没有重载。

【讨论】:

    【解决方案4】:

    不,c++ 中的向量不是指针。 向量是c++中的一个类

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2016-02-19
      • 2011-04-24
      • 1970-01-01
      相关资源
      最近更新 更多