L3 - 一维数组实战
L3 - 一维数组实战
🎯 教学目标
- 掌握数组的声明与初始化
- 熟练使用循环处理数组元素
- 实现基础统计算法
🔑 核心知识点
数组声明与初始化
1 | // 标准声明方式 |
关键要点:
-
内存分配原理:
- 连续内存块分配
- 每个元素占数据类型对应字节数(int通常4字节)
- 数组总大小 = 元素个数 × sizeof(元素类型)
-
初始化规则:
1
2
3int arr1[3]; // 值随机(危险!)
int arr2[3] = {1,2}; // [1,2,0]
int arr3[] = {9,8,7}; // 长度自动推导为3 -
访问机制:
- 索引从0开始计算
- 通过首地址偏移访问元素
- arr[i] 等效于 *(arr + i)
数组遍历标准模板
1 | const int N = 5; // 最佳实践:用常量表示数组长度 |
执行流程解析:
1 | 内存地址 | 0x1000 | 0x1004 | 0x1008 | 0x100C | 0x1010 |
📊 数据处理算法
求最大值算法
1 | int findMax(int arr[], int size) { |
算法优化技巧:
- 初始值设为
INT_MIN
可处理全负数数组 - 可同步记录最大值索引
- 时间复杂度:O(n)
逆序存储算法
1 | void reverseArray(int arr[], int size) { |
内存变化演示:
1 | 原始数组:[1][2][3][4][5] |
💡 特别提示
数组越界陷阱
1 | int arr[3] = {1,2,3}; |
- 可能后果:
- 输出垃圾值
- 程序崩溃(Segment Fault)
- 覆盖其他变量内存
字符数组注意事项
1 | char str1[5] = "hello"; // 错误!需要6个位置(含\0) |
字符串处理要点:
- 使用
strlen()
获取实际长度 cin.getline(str, size)
安全输入- 末尾必须保留
\0
💣 易错点详解
-
变量定义数组长度
1
2int n = 5;
int arr[n]; // C99允许,但C++标准禁止! -
越界访问导致数据污染
1
2
3int a = 10;
int arr[3] = {1,2,3};
arr[3] = 4; // 实际修改了a的值! -
数组整体赋值错误
1
2
3int arr1[3] = {1,2,3};
int arr2[3];
arr2 = arr1; // 错误!数组不能直接赋值 -
误用sizeof计算元素个数
1
2
3int arr[] = {1,2,3,4,5};
int size = sizeof(arr); // 错误!返回总字节数
// 正确写法:sizeof(arr)/sizeof(arr[0])
🛠️ 调试技巧
数组内容可视化调试
1 | // 调试专用输出函数 |
输出示例:
1 | 索引 地址 值 |
边界值测试策略
- 空数组测试(size=0)
- 单元素数组测试
- 全相同元素数组
- 极值测试(INT_MAX/MIN)
🏋️ 配套练习
-
成绩分析系统
- 输入:n个学生成绩(0-100)
- 输出:
- 平均分(保留2位小数)
- 最高分及人数
- 各分数段分布(0-59,60-69,…)
-
元素查找器
- 输入:长度为10的数组,1个目标数
- 输出:
- 首次出现位置(从1开始)
- 最后一次出现位置
- 未找到时输出"Not Found"
-
数组洗牌器
- 输入:数组长度n,数组元素
- 输出:
- 奇数在前偶数在后,相对顺序不变
- 示例:
输入:5 [2,5,8,3,6]
输出:5 3 2 8 6
-
矩阵转置器
- 输入:3x3矩阵
- 输出:转置矩阵
1
2
3
4
5
6
7
8输入:
1 2 3
4 5 6
7 8 9
输出:
1 4 7
2 5 8
3 6 9
-
凯撒密码加密机
- 输入:字符串(仅字母),偏移量
- 输出:加密结果(Z后回到A)
1
2输入:ATTACK 3
输出:DWWDFN
评论