【发布时间】: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]是底层数组的地址。