C++零基础到工程实战(4.3.1):数组与vector初识——连续内存与动态数组的本质解析

张开发
2026/4/17 21:32:22 15 分钟阅读

分享文章

C++零基础到工程实战(4.3.1):数组与vector初识——连续内存与动态数组的本质解析
目录一、本节学习内容概要图二、前言三、数组是什么3.1 数组的本质3.2 数组为什么访问快1访问值的本质2访问地址3.3 数组变量的本质1可以这样理解2一个关键区别3简单例子对比四、C中的数组分类4.1 栈区数组1定义方式2生命周期3空间大小申请4空间大小计算5栈区特点6优缺点4.2 堆区数组1基本定义2内存释放3生命周期4堆区特点5优缺点4.3 vector容器数组1头文件与命名空间2vector语法本质3vector 的内存结构4vector 的核心优势5常用操作示例6迭代器访问4.4 三种数组的核心对比五、数组 vs vector 对比六、本节总结6.1 数组核心6.2 三种数组6.3 一句话总结一、本节学习内容概要图二、前言在前面的内容中我们已经学习了变量与基本类型if / switch 条件控制for / while 循环控制但在实际开发中仅仅会“控制流程”是不够的我们还需要解决一个更核心的问题数据如何存储例如一批图片数据如何存储一组路径点如何管理多个传感器数据如何统一处理大量计算结果如何高效访问这些问题本质上都离不开一种结构数组Array与容器Container在 C 中我们最常用的就是数组Arrayvector动态数组这一节我们不只是学“怎么用”更重要的是搞清楚它们的底层本质和内存结构三、数组是什么3.1 数组的本质数组本质上是一段连续的内存空间例如int arr[5] {1,2,3,4,5};在内存中可以理解为int 4个字节地址 1000 1004 1008 1012 1016 数据 1 2 3 4 5 这里有几个非常关键的点每个元素紧挨着存储连续每个元素类型相同int每个元素占用固定字节数4字节3.2 数组为什么访问快我们来看最常见的访问方式arr[3];1访问值的本质这句代码本质上做的事情是首地址 下标 × 元素大小等价写法*(arr 3); 逐步拆解理解arr→ 数组首地址arr 3→ 第 4 个元素的地址*(arr 3)→ 取该地址中的值✅ 访问值总结写法含义arr[3]访问第4个元素的值*(arr 3)访问第4个元素的值2访问地址如果我们想要“地址”就要这样写arr[3];等价arr 3;✅ 地址 vs 值对比重点表达式类型含义arrint*首地址arr 3int*第4个元素地址arr[3]int*第4个元素地址*(arr 3)int第4个元素的值arr[3]int第4个元素的值 为什么数组访问这么快因为 CPU 只需要一次地址计算偏移一次内存读取 不需要查表、不需要跳转 时间复杂度O(1)✅ 一句话总结arr i 是地址*(arr i) 才是值3.3 数组变量的本质int arr[5]; 这里最关键的一点是arr本质上表示这段连续内存的“首地址”1可以这样理解int* p arr; 完全等价成立说明arr 可以当作一个指针使用指向数组的第一个元素2一个关键区别 arr 不是指针变量而是数组名在大多数表达式中会“退化”为指针”3简单例子对比int arr[5]; int* p arr;名称本质arr数组名固定地址p指针变量可以改变指向 关键区别p p 1; // ✅ 可以 arr arr 1; // ❌ 错误数组名不能修改四、C中的数组分类在 C 中数组并不只有一种形式。根据内存分配方式和管理方式的不同通常可以分为三类栈区数组Stack Array堆区数组Heap Arrayvector动态数组容器这三者的核心区别本质上是内存在哪分配谁来管理是否可扩展4.1 栈区数组1定义方式int arr[10]; string strs[10]; char str[10];数组 类型 数量 这种数组定义在函数内部内存分配在栈区由系统自动管理2生命周期void func() { int arr[5]; } 执行过程进入函数 → 分配内存离开函数 → 自动释放3空间大小申请 通过[]控制int arr[10]; 关键点你图里的重点✅必须是编译期常量constexpr❌ 不支持int n 10; int arr[n]; // ❌ 标准C不支持GCC扩展除外4空间大小计算sizeof(arr); 作用返回整个数组占用的字节数例如int arr[10]; cout sizeof(arr); // 405栈区特点内存从高地址向低地址增长分配速度非常快几乎是指令级不需要程序员管理6优缺点✅ 优点访问速度快自动释放安全使用简单❌ 缺点空间有限容易栈溢出大小必须固定4.2 堆区数组1基本定义int* arr new int[5];或者auto arr3 new char[4]; 这种数组分配在堆区由程序员手动管理2内存释放delete[] arr2; delete[] arr3; 如果不释放❌ 会发生内存泄漏3生命周期不受作用域限制只要不 delete就一直存在4堆区特点内存从低地址向高地址增长空间较大分配速度比栈慢涉及系统管理5优缺点✅ 优点支持动态分配运行时决定大小生命周期灵活❌ 缺点需要手动释放容易内存泄漏使用复杂4.3 vector容器数组1头文件与命名空间#include vector std::vectorint v; vector 是C STL 提供的动态数组容器可以理解为“自动管理的堆数组 更安全的接口”2vector语法本质vector元素类型 变量名(初始数量);例如vectorint v(10);3vector 的内存结构vector 的结构其实是“栈 堆”的结合栈区v内部包含指针 size capacity堆区实际存储的数据连续空间 说明v 这个变量本身在栈上数据在堆上4vector 的核心优势相比普通数组✅ 自动扩容不用关心大小✅ 自动释放避免内存泄漏✅ 提供丰富操作接口5常用操作示例v.push_back(10); // 末尾插入 v.erase(v.begin()); // 删除第一个元素6迭代器访问for (auto it v.begin(); it ! v.end(); it) { cout *it; }4.4 三种数组的核心对比特性栈区数组堆区数组vector内存位置栈堆栈 堆生命周期自动手动自动大小固定可变可变安全性高低高使用难度简单较复杂简单是否推荐小数据特殊场景⭐工程首选五、数组 vs vector 对比特性数组vector内存连续连续大小固定可变管理手动自动安全性低高六、本节总结6.1 数组核心连续内存O(1)访问arr 是首地址6.2 三种数组类型特点栈数组自动释放堆数组手动管理vector自动动态6.3 一句话总结数组 性能极致但不灵活vector 工程首选容器

更多文章