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
我们可以看到&v
和&v[0]
有不同的地址。那么 v 是指向向量开头的指针吗?如果是这样,为什么我无法访问*v
?是不是我做错了?
谢谢
【问题讨论】:
为什么要这样访问它?这就是迭代器的用途。 这是参考。他们的记忆位置。vector
是一个模板,vector<int>
是一个类,v[0]
是一个 int
。实现如何,甚至是否使用指针是一个内部细节,没有记录,也不能依赖。你为什么在乎?最后两行打印相同的地址是预期的,并且对所有引用类型参数都一样。
对于std::vector
类型可以做什么或不能做什么,请查阅 C++ 标准、一本好书或例如cppreference.com。如果你很好奇,你也可以阅读std::vector
模板的源代码,尽管作为初学者有点难以理解。作为这里的新用户,从tour 开始阅读How to Ask。
int *p = v.data(); cout<<p<<" "<<&v[0]
将是相同的。 &v
是向量对象的地址,&v[0]
是底层数组的地址。
【参考方案1】:
c++中的vector是指针吗?
没有。 std::vector
不是指针。这是一门课。
那么 v 是指向向量开头的指针吗?
不,但是v
(向量类的一个实例)恰好包含一个指向数组开头的指针。
为什么我无法访问
*v
?
因为类 std::vector
的一元 operator*
没有重载。
【讨论】:
那么如果我需要访问中间任何元素的地址是&v[i]
我唯一的方法?
@RishabBalasubramanian 您不需要使用 addressof 运算符来访问元素。此外,下标运算符不是访问元素的唯一方法。还有其他方法,例如使用指针或向量迭代器。【参考方案2】:
std::vector
结构可能包含其他数据,例如长度。连续元素存储在单独的位置,并且该位置会随着数组大小的调整而改变。只要v
不移动,&v
就应该保持不变,但由于多种原因,&v[0]
可能会失效。
想象一下,粗略地说,它是:
struct vector
size_t size;
T* elements;
;
当您使用 &v[0]
时,operator[]
实现会接管。
它不是指针,它的行为与new[]
非常不同。
【讨论】:
谢谢,我想我明白了。【参考方案3】:std::vector
是一个封装动态大小数组的序列容器。
所以肯定不是指针。
正如@tadman 所说,v
(向量类的一个实例)恰好包含一个指向数组开头的指针。
您无法访问*v
,因为std::vector
类的一元运算符* 没有重载。
【讨论】:
【参考方案4】:不,c++ 中的向量不是指针。 向量是c++中的一个类
【讨论】:
以上是关于c++中的vector是指针吗?的主要内容,如果未能解决你的问题,请参考以下文章