问题背景
一次debug中发现使用&vec
和&vec[0]
得到的两个地址居然不相同,即vector的对象存放的地址和首元素地址不相同。在C++中与vector最类似的数据结构是数组,而对数组进行取变量名地址和取首元素地址的结果是相同的,并且都存放在栈区。向量vector显示出了与数组不一样的特征
解释分析
在查询资料和实践后,得到了如下的解释:在C++中,vector的对象存放在栈区,元素存放在堆区,且变量名地址中存放的是堆区元素的首地址
代码实践
void test()
{
vector<int> v;
for (int i = 0; i < 3; i++)
{
v.push_back(i);
}
cout<<&v<<' '<<&v[0]<<endl;
}
int main()
{
test();
vector<int> v1;
for (int i = 0; i < 5; i++)
{
v1.push_back(i);
}
cout<<&v1<<' '<<&v1[0]<<endl;
int *p = new int(10);
cout<<p<<endl;
}
结果为
0x61fd80 0xe460a0
0x61fdf0 0xe460c0
0xe460a0
根据已知,因为指针p指向用new关键字开辟的一块内存空间,所以肯定存放在堆区,而vector对象的首元素地址的前几位和p指向的堆区的内存空间相同,所以vector的元素存放在堆区。反之vector变量名所存放的地址前几位与之差别较大,所以是存放在栈区