C++内存管理全解析:从智能指针到多线程优化实战
2026/7/22 5:24:45
在实际编程中,如果需要统计全班同学的成绩并算平均分,逐个定义变量非常不方便:
int score1; int score2; int score3; ... int score1000; // 定义1000个变量,显然不现实数组正是为了解决"大量同类型变量定义"的问题。数组是有序数据的集合,可以一次性批量定义多个变量。
定义方式:
类型说明符 数组名[常量表达式];三个部分的含义:
| 部分 | 说明 |
|---|---|
| 类型说明符 | 数组中每个变量的类型,如int、float、char |
| 数组名 | 一组变量集合的标识符,命名规则与变量名一致 |
| [常量表达式] | 数组的长度,即数组中变量(元素)的个数,必须是整型 |
示例:
int score[1000]; // 定义了一个int型数组,包含1000个int型变量注意:C99 标准之后,方括号内也可以使用变量(可变长数组),但此时不能初始化:
int n; scanf("%d", &n); int a[n]; // 可变长数组,不能初始化
// 1. 全部初始化 int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 2. 部分初始化 —— 值依次给到前面的元素,后面未初始化的元素默认为 0 int a[10] = {1, 2, 3, 4, 5}; // 3. 不初始化 —— 数组中是随机值(垃圾值) int a[10]; // 4. 初始化成全 0 int a[10] = {0}; // 5. 省略数组长度 —— 长度由初始化值的个数推算 int a[] = {1, 2, 3, 4}; // 最终长度为 4数组不能整体赋值,必须给到具体的元素:
// 错误写法 int a[10]; a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 不对! // 正确写法 —— 逐个元素赋值 a[0] = 2; a[1] = 5; // ... 配合 for 循环批量赋值通过下标(编号)来访问数组中的每个变量:
数组名[下标]| 特点 | 说明 |
|---|---|
| 连续性 | 数组在内存中占用一片连续的空间 |
| 单一性 | 数组中存放的是同一类型的数据 |
| 有序性 | 第一个元素后面紧跟着第二个,依次排列 |
内存示例:
0x7fc30194190: a[0] = 1 0x7fc30194194: a[1] = 2 0x7fc30194198: a[2] = 3 0x7fc3019419c: a[3] = 4 ...int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; for (int i = 0; i < 10; i++) { if (a[i] % 3 == 0) printf("%d ", a[i]); }int a[10], sum = 0; for (int i = 0; i < 10; i++) { scanf("%d", &a[i]); sum += a[i]; } printf("sum = %d\n", sum);int max = a[0]; // 擂台法,先假设第一个元素最大 for (int i = 1; i < 10; i++) { if (a[i] > max) max = a[i]; }核心思路:交换下标为i和数组长度-1-i的元素
原始: 1 2 3 4 5 6 7 8 9 10 逆序: 10 9 8 7 6 5 4 3 2 1 交换关系: i <-> (长度-1-i) i=0 <-> 9 i=1 <-> 8 i=2 <-> 7 i=3 <-> 6 i=4 <-> 5int len = 10; int temp; for (int i = 0; i < len / 2; i++) { temp = a[i]; a[i] = a[len - 1 - i]; a[len - 1 - i] = temp; }| 算法 | 说明 |
|---|---|
| 选择排序 | 核心思想:给合适的位置选择合适的数 |
| 冒泡排序 | 相邻元素两两比较,逐步"冒泡" |
| 插入排序 | 将元素插入到已排序部分的正确位置 |
| 快速排序 | 需要用到指针 |