文章目录
- 一、问题发现:
- 二、结果分析
- 三、问题解析
一、问题发现:
&vector和&vector[0]得到的两个地址居然不相同,对数组array取变量名地址和取首元素地址的结果是相同的。这是为啥呢?
使用下面代码进行验证:
#include<iostream>
#include<vector>
#include<array>
using namespace std;
int main()
{
vector<int> a(5);
cout << &a << endl;
cout << &a[0] << endl;
cout<<a.capacity()<<endl;
array<int,5> arr;
cout << &arr << endl;
cout << &arr[0] << endl;
cout << arr.size() << endl;
return 0;
}
二、结果分析
可以发现vector的取数组名和首元素地址确实有很大差别。还记得我们在以前学习C语言数组时讲过&数组名取得就是这个数组元素的首地址,以为就是说取数组名等于取首元素地址。但是在这里为啥就不符合了呢?
三、问题解析
其实要搞懂这个问题,我们要先理清楚vector,array的底层逻辑。
- 这里的
array
数组是C++中的一个固定大小的序列容器,并且存储在连续的内存位置,不能动态扩展或收缩。相当于C语言中的数组。 vector
在C++中称为“向量”,是一个可动态扩容缩容的序列容器,并且也是存储在连续的内存位置。相当于一个可变数组。扩容时使用的动态开辟内存在堆上开空间。
当你创建一个 vector 对象时,会在栈区上分配一个存储 vector 元数据的对象(例如,指向堆区数组的指针和数组的大小)。而实际的元素数组则在堆区动态分配内存。如下图:
看到这里相必就十分清楚了。
至于array在上面例子中,可以看出它的地址和栈最近,所以是存储在栈区。其实,不同的问题要不同分析。比如如果使用动态开辟函数就是涉及到堆区,看到指针就知道指针存在栈区,static静态就存在全局区(静态区),字符串常量就存储在代码段。