【发布时间】:2018-07-26 17:09:43
【问题描述】:
我创建了一个向量 a 并尝试显示 &a 和 &a[0]。地址非常不同。对象地址通常不是与第一个元素地址相同吗?对象内存不是连续的吗?我注意到 &a+1 和 &a 之间的地址差异与整个向量元素的大小完全相同,在这种情况下为 12 个字节。在我看来,它就像是整个向量的副本。
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> a ={3,5,8};
cout<<"vector object address: "<<&a<<endl;
cout<<"vector object address +1: "<<&a+1<<endl;
cout<<"vector data[0] address: "<<&a[0]<<endl;
cout<<"vector data[1] address: "<<&a[1]<<endl;
return 0;
}
谁能向我解释一下矢量对象是如何工作的?下面是代码输出:
vector object address: 0034FEBC
vector object address +1: 0034FEC8
vector data[0] address: 007D8208
vector data[1] address: 007D820C
【问题讨论】:
-
请阅读the tour 并阅读the help page。请将代码发布为代码,而不是链接或图像。欢迎来到 SO。
-
“不是对象地址通常与第一个元素地址相同吗?” - 不,不是标准容器(可能除了
std::array)。 -
要寻址
std::vector的底层连续数组,请使用std::vector::data()函数。取std::vector变量本身的地址是另一回事。 @Galik is right about that 提到std::array是个例外。 -
这两个
[]地址在我看来是连续的。还记得sizeof(int)吗? -
@fuhuan26 在这里提问之前最好先咨询documentation。
std::vector<int>不是 C 风格int[]原始数组的 POD 替代品。虽然它完全可以使用data()函数和size()进行转换。
标签: c++ pointers memory memory-management reference