c++中的vector是指针吗?

Posted

技术标签:

【中文标题】c++中的vector是指针吗?【英文标题】:Is vector in c++ a pointer? 【发布时间】: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] 是底层数组的地址。 【参考方案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++中的一个类

【讨论】:

以上是关于c++中的vector是指针吗?的主要内容,如果未能解决你的问题,请参考以下文章

C++中的指针和向量

我必须在这里使用指针吗?

容器(vector)和指针(ptr)的区别

指向 C++ 中的引用的指针

有 C++ 惰性指针吗?

C++ 中的指针错误