数组是 C++ 中用于存储相同类型数据的固定长度序列结构,广泛应用于数据处理、循环遍历、查找、排序等编程场景。本篇将从定义、初始化、遍历、多维数组等方面介绍数组的使用方法与注意事项,并扩展至更现代与安全的使用方法。
一、数组定义与初始化
1.1 数组定义
类型名 数组名[长度];
示例:
int scores[5]; // 声明一个包含5个int的数组
char letters[10]; // 声明一个包含10个字符的数组
1.2 数组初始化方式
int arr[3] = {1, 2, 3};
int arr[] = {4, 5, 6}; // 自动推导长度
int arr[5] = {1}; // 未赋值元素自动为0
二、数组访问与遍历
数组元素通过下标访问,范围从 0
到 长度-1
。
示例:
int arr[3] = {10, 20, 30};
std::cout << arr[0]; // 输出10
遍历:
for (int i = 0; i < 3; ++i) {
std::cout << arr[i] << " ";
}
⚠️ C++ 不会自动检查越界访问,
arr[10]
可能导致未定义行为!
三、数组与函数
数组可作为参数传递给函数(实为指针传递)。
void printArray(int arr[], int size) {
for (int i = 0; i < size; ++i)
std::cout << arr[i] << " ";
}
调用:
int nums[4] = {1, 2, 3, 4};
printArray(nums, 4);
✅ 可通过传递长度参数避免访问越界
四、多维数组
定义:
int matrix[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
访问:
std::cout << matrix[1][2]; // 输出6
遍历:
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 3; ++j) {
std::cout << matrix[i][j] << " ";
}
std::cout << std::endl;
}
五、常见数组操作练习
-
求数组最大/最小值
-
数组元素求和与平均值
-
查找元素是否存在
-
数组排序(冒泡/选择排序)
-
数组倒序
六、高级用法拓展
6.1 使用 std::size()
获取数组长度(C++17)
#include <iostream>
#include <iterator>
int arr[] = {10, 20, 30};
std::cout << std::size(arr); // 输出3
✅ 避免手动
sizeof(arr) / sizeof(arr[0])
6.2 使用模板传递数组引用(保留数组大小)
template<size_t N>
void printArrayRef(int (&arr)[N]) {
for (int i = 0; i < N; ++i)
std::cout << arr[i] << " ";
}
✅ 更安全地传参,防止数组退化为指针
6.3 使用 std::array
替代原始数组(推荐)
#include <array>
std::array<int, 3> arr = {1, 2, 3};
arr[1] = 10;
for (int v : arr)
std::cout << v << " ";
优点:
-
自动推导长度
-
提供
.size()
、.at()
、迭代器等 STL 接口 -
可直接用于 STL 算法
6.4 使用范围-based for 循环(C++11 起)
int arr[] = {4, 5, 6};
for (int val : arr) {
std::cout << val << " ";
}
✅ 可读性强、避免越界访问
6.5 配合 STL 算法使用数组指针范围
#include <algorithm>
int arr[] = {3, 1, 2};
std::sort(std::begin(arr), std::end(arr)); // 排序
📌 总结
功能 | 示例/说明 |
---|---|
定义数组 | int a[5]; |
初始化数组 | {1, 2, 3} |
访问元素 | arr[i] |
遍历 | for 循环、range-based for |
多维数组 | int a[2][3]; |
函数参数传递 | void func(int arr[], int size) |
安全替代 | std::array 、模板引用 |
使用 STL | std::sort(begin(arr), end(arr)) |
数组是 C++ 编程中处理数据最基础也最重要的工具之一。打好数组基础不仅有助于处理基本问题,还能更好地理解 STL 容器、内存管理与指针操作,为构建高质量程序打下坚实基础。