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)覆盖法——前向后覆盖

从删除位置开始,将后续元素依次向前移动一位,覆盖待删除元素。

步骤

  1. 确定删除位置(下标index
  2. index开始,将arr[i+1]赋值给arr[i]
  3. (可选)最后一个元素可不清零,但逻辑上数组长度减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)覆盖法——后向前覆盖

从数组末尾开始向前遍历,找到待删除元素后用最后一个元素覆盖它。

步骤

  1. 遍历数组找到目标元素(假设下标index
  2. 用最后一个元素覆盖arr[index]
  3. 逻辑长度减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; // 错误:数组名是常量,不能赋值

解决方法:通过循环逐个复制元素

九、练习题

  1. 定义一个包含5个整数的数组,通过循环输入元素值,然后计算所有元素的平均值并输出。
  2. 【题⽬描述】 给你⼀个⻓度为n的数组,你只需要将它原样输出。
    【输⼊】 第⼀⾏⼀个整数n。第⼆⾏n个正整数。
    【输出】 原样输出这n个正整数。
    【输⼊样例】 5
                          1 2 3 4 5
    【输出样例】 1 2 3 4 5 
  3. 在第二题的基础上来个倒序输出 输出5 4 3 2 1。

十、总结

  • 一维数组是相同类型元素的连续集合,通过下标访问(从0开始)
  • 数组大小在定义时确定,且必须是常量表达式(C++11前)
  • 数组支持初始化、遍历、修改操作,但大小固定,增删元素需手动移动元素
  • 常见错误:下标越界、数组名赋值、使用变量定义大小

声明:本博客只针对c++初学者,或者中小学生喔。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐