14、c++一维数组基础
数组是相同数据类型元素的有序集合,所有元素在内存中占据连续的存储空间。数组通过下标(索引)来访问元素,可实现批量数据的高效管理和操作。数组的优势一次性定义多个同类型变量,简化代码元素地址连续,访问速度快支持循环遍历,适合批量处理数据cpp数据类型 数组名[数组大小];数据类型:数组中所有元素的数据类型(如int、double、char等)数组名:遵循标识符命名规则,建议有意义(如scores、ag
C++一维数组基础教程
一、概念
1. 什么是数组?
数组是相同数据类型元素的有序集合,所有元素在内存中占据连续的存储空间。数组通过下标(索引) 来访问元素,可实现批量数据的高效管理和操作。
数组的优势:
- 一次性定义多个同类型变量,简化代码
- 元素地址连续,访问速度快
- 支持循环遍历,适合批量处理数据
2. 一维数组
一维数组是最简单的数组形式,只有一个维度,通过单个下标即可定位元素。例如:存储班级学生成绩、一组坐标点的x值等。
二、一维数组的定义
1. 语法格式
cpp
数据类型 数组名[数组大小];
- 数据类型:数组中所有元素的数据类型(如int、double、char等)
- 数组名:遵循标识符命名规则,建议有意义(如scores、ages)
- 数组大小:表示数组可容纳的元素个数,必须是常量表达式(C++11前不允许变量)
2. 定义示例
cpp
// 定义一个能存储5个整数的数组
int scores[5];
// 定义一个能存储10个字符的数组
char name[10];
// 定义一个能存储3个双精度浮点数的数组
double heights[3];
// 正确:使用const常量定义大小(推荐)
const int SIZE = 5;
int numbers[SIZE];
// 错误:数组大小不能是变量(C++11前)
int n = 5;
int arr[n]; // 编译错误
三、数组的访问
1. 通过下标访问
数组元素通过数组名[下标] 访问,下标从0开始(即第一个元素下标为0)。
思考在python中下标-1表示的是最后列表一个元素,那么在c++中,输出数组下标为-1能会报错?
示例:
cpp
int scores[3] = {90, 85, 95};
cout << scores[0]; // 输出第一个元素:90
cout << scores[2]; // 输出第三个元素:95
// 修改元素值
scores[1] = 88; // 将第二个元素修改为88
⚠️ 注意:下标越界(访问超出数组大小范围的下标)是常见错误,会导致未定义行为(可能崩溃或数据错误)。
cpp
int arr[3];
arr[3] = 10; // 越界访问!数组大小为3,有效下标为0-2
2. 利用循环访问
通过循环遍历数组是处理批量数据的高效方式,常用for循环实现。
示例1:普通for循环
cpp
int scores[5] = {90, 85, 95, 88, 92};
for (int i = 0; i < 5; i++) { // i从0到4(数组大小-1)
cout << "第" << i+1 << "个元素:" << scores[i] << endl;
}
示例2:范围for循环(C++11及以上)
cpp
int scores[5] = {90, 85, 95, 88, 92};
for (int score : scores) { // 自动遍历数组所有元素
cout << score << " ";
}
// 输出:90 85 95 88 92
计算数组长度:使用sizeof运算符
cpp
int scores[5];
int length = sizeof(scores) / sizeof(scores[0]); // 总字节数 / 单个元素字节数
cout << "数组长度:" << length; // 输出:5
四、修改数组数
通过下标直接赋值即可修改数组元素,支持单个修改或批量修改。
示例:
cpp
int arr[3] = {1, 2, 3};
// 单个修改
arr[0] = 10; // 修改第一个元素
// 批量修改(循环)
for (int i = 0; i < 3; i++) {
arr[i] *= 2; // 所有元素乘以2
}
// 修改后数组:[10, 4, 6]
五、输入数组数据
1. 通过下标输入单个数据
cpp
int arr[3];
cout << "请输入3个整数:";
cin >> arr[0] >> arr[1] >> arr[2]; // 依次输入3个元素
2. 利用循环输入数据
适合元素较多的数组,通过循环逐个输入。
示例:
cpp
const int SIZE = 5;
int numbers[SIZE];
cout << "请输入" << SIZE << "个整数:" << endl;
for (int i = 0; i < SIZE; i++) {
cout << "第" << i+1 << "个:";
cin >> numbers[i];
}
六、数组的增删操作
数组大小固定,不支持动态扩容/缩容,增删元素需通过元素移动实现。
1. 删除数据
(1)覆盖法——前向后覆盖
从删除位置开始,将后续元素依次向前移动一位,覆盖待删除元素。
步骤:
- 确定删除位置(下标
index) - 从
index开始,将arr[i+1]赋值给arr[i] - (可选)最后一个元素可不清零,但逻辑上数组长度减1
示例:删除下标为1的元素
cpp
int arr[5] = {1, 2, 3, 4, 5};
int index = 1; // 要删除的元素下标
int length = 5; // 当前数组长度
// 前向后覆盖
for (int i = index; i < length - 1; i++) {
arr[i] = arr[i + 1];
}
length--; // 逻辑长度减1
// 输出结果:1 3 4 5 5(最后一个元素未清零,但逻辑上已删除)
⚠️ 缺点:若数组中有重复元素,可能误删目标元素后的重复值。
(2)覆盖法——后向前覆盖
从数组末尾开始向前遍历,找到待删除元素后用最后一个元素覆盖它。
步骤:
- 遍历数组找到目标元素(假设下标
index) - 用最后一个元素覆盖
arr[index] - 逻辑长度减1
示例:删除值为3的元素
cpp
int arr[5] = {1, 3, 2, 3, 4};
int target = 3; // 要删除的值
int length = 5;
for (int i = 0; i < length; i++) {
if (arr[i] == target) {
arr[i] = arr[length - 1]; // 用最后一个元素覆盖
length--;
break; // 只删除第一个找到的元素
}
}
// 结果:1 4 2 3(逻辑长度4,最后一个元素3被忽略)
(3)数组元素删除特点(后向前)
- 优点:只需移动一次元素,效率高(时间复杂度O(1))
- 缺点:改变了数组元素的顺序
- 适用场景:不关心元素顺序,追求删除效率
2. 插入数据
(1)数组插入数据特点
- 前提:数组有空闲空间(逻辑长度 < 物理大小)
- 步骤:从插入位置开始,将后续元素依次向后移动一位,腾出位置插入新元素
- 时间复杂度:O(n)(需要移动n个元素)
示例:在index=2位置插入元素6
cpp
int arr[5] = {1, 2, 3, 4}; // 物理大小5,逻辑长度4
int index = 2; // 插入位置
int value = 6; // 插入值
int length = 4;
// 检查是否有空间
if (length >= 5) {
cout << "数组已满,无法插入!";
return;
}
// 元素后移
for (int i = length; i > index; i--) {
arr[i] = arr[i - 1];
}
// 插入新元素
arr[index] = value;
length++;
// 结果:1 2 6 3 4(逻辑长度5)
⚠️ 注意:
- 插入位置必须合法(0 ≤ index ≤ length)
- 数组物理大小固定,插入可能导致溢出(需提前检查)
- 大量插入操作效率低,实际开发中常用动态数据结构(如vector)
七、数组的初始化
数组定义时可以直接初始化,多种初始化方式:
1. 全部初始化
cpp
int arr[3] = {1, 2, 3}; // 初始化3个元素
2. 部分初始化
未显式初始化的元素会被自动初始化为0(数值类型)或空字符(字符数组)
cpp
int arr[5] = {1, 2}; // 前2个元素为1,2,后3个为0
char str[5] = {'a', 'b'}; // 前2个为'a','b',后3个为'\0'
3. 省略数组大小
初始化时可省略数组大小,编译器会根据初始化列表元素个数自动确定大小
cpp
int arr[] = {1, 2, 3, 4}; // 数组大小自动为4
4. C++11列表初始化(推荐)
可省略等号,更简洁
cpp
int arr[3]{1, 2, 3}; // C++11新特性
int arr2[]{1, 2, 3, 4}; // 省略大小和等号
八、常见错误及避免方法
1. 下标越界
错误示例:
cpp
int arr[3] = {1, 2, 3};
cout << arr[3]; // 越界访问(最大下标为2)
避免方法:
- 使用
const常量定义数组大小 - 通过
sizeof计算数组长度,循环中使用长度控制边界
2. 数组大小使用变量
错误示例:
cpp
int n = 5;
int arr[n]; // C++11前不允许,C++11后允许但不推荐
避免方法:
- 使用
const常量或#define宏定义大小 - 如需动态大小,使用标准库
vector(后续学习)
3. 数组名误用
数组名代表数组首地址,不能直接赋值给其他数组
cpp
int a[3] = {1, 2, 3};
int b[3];
b = a; // 错误:数组名是常量,不能赋值
解决方法:通过循环逐个复制元素
九、练习题
- 定义一个包含5个整数的数组,通过循环输入元素值,然后计算所有元素的平均值并输出。
- 【题⽬描述】 给你⼀个⻓度为n的数组,你只需要将它原样输出。
【输⼊】 第⼀⾏⼀个整数n。第⼆⾏n个正整数。
【输出】 原样输出这n个正整数。
【输⼊样例】 5
1 2 3 4 5
【输出样例】 1 2 3 4 5 - 在第二题的基础上来个倒序输出 输出5 4 3 2 1。
十、总结
- 一维数组是相同类型元素的连续集合,通过下标访问(从0开始)
- 数组大小在定义时确定,且必须是常量表达式(C++11前)
- 数组支持初始化、遍历、修改操作,但大小固定,增删元素需手动移动元素
- 常见错误:下标越界、数组名赋值、使用变量定义大小
声明:本博客只针对c++初学者,或者中小学生喔。
更多推荐
所有评论(0)