个人免费网站建站运营,广告营销平台,电脑网站手机版怎么做,wordpress centos 安装文章目录 一、问题发现#xff1a;二、结果分析三、问题解析 一、问题发现#xff1a;
vector和vector[0]得到的两个地址居然不相同#xff0c;对数组array取变量名地址和取首元素地址的结果是相同的。这是为啥呢#xff1f;
使用下面代码进行验证#xff1a;… 文章目录 一、问题发现二、结果分析三、问题解析 一、问题发现
vector和vector[0]得到的两个地址居然不相同对数组array取变量名地址和取首元素地址的结果是相同的。这是为啥呢
使用下面代码进行验证
#includeiostream
#includevector
#includearray
using namespace std;int main()
{vectorint a(5);cout a endl;cout a[0] endl;couta.capacity()endl;arrayint,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静态就存在全局区静态区字符串常量就存储在代码段。