C++ 数组
在 C++ 中,数组(Array) 是一种用于存储 相同数据类型 的 固定大小 数据结构。数组在 性能优化 和 批量数据处理 方面非常重要。本文将全面解析 C++ 数组的 定义、初始化、遍历、多维数组、指针与数组的关系、常见操作 以及 STL(标准库)中的 std::array 和 std::vector 等内容。
1. C++ 数组的定义和声明
1.1 一维数组的声明
语法格式:
数据类型 数组名[数组大小];
示例:
int arr[5]; // 声明一个包含5个元素的整型数组
⚠️ 数组的大小必须是编译时确定的常量(C++标准数组)。C++ 11 之后可以使用
std::vector来支持动态数组。
2. 数组初始化方式
2.1 直接初始化
int arr[5] = {1, 2, 3, 4, 5}; // 直接赋值
2.2 部分初始化(未赋值元素自动初始化为 0)
int arr[5] = {1, 2}; // 剩下的元素默认为 0
输出:
1 2 0 0 0
2.3 省略大小(自动推导)
int arr[] = {10, 20, 30}; // 自动推导数组大小为 3
2.4 默认初始化(无初始化时,数组的值是未定义的)
int arr[5]; // 数组中的值是垃圾值
3. 访问和遍历数组
3.1 使用 for 循环遍历
#include <iostream>
using namespace std;
int main() {
int arr[] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}
return 0;
}
输出: 1 2 3 4 5
3.2 使用 range-based for(C++11 及以上)
for (int num : arr) {
cout << num << " ";
}
优点: 代码简洁,适用于 只读 访问。
3.3 使用指针遍历数组
for (int* ptr = arr; ptr < arr + 5; ptr++) {
cout << *ptr << " ";
}
优点: 适用于指针操作、动态数组。
4. 多维数组
4.1 二维数组的声明
int matrix[3][3]; // 声明 3x3 矩阵
4.2 二维数组的初始化
int matrix[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
4.3 二维数组遍历
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
5. 数组与指针的关系
5.1 数组名即指针
数组的名称 arr 本质上是 指向首元素的指针:
int arr[5] = {1, 2, 3, 4, 5};
cout << arr; // 输出数组的首地址
cout << *arr; // 输出第一个元素,即 1
5.2 指针访问数组
int* p = arr;
cout << *(p + 1); // 等同于 arr[1]
5.3 数组传递给函数
数组作为函数参数时,本质上传递的是 指针:
void printArray(int* arr, int size) {
for (int i = 0; i < size; i++) {
cout << arr[i] << " ";
}
}
int main() {
int nums[] = {10, 20, 30, 40};
printArray(nums, 4);
}
注意: 不能在函数内用
sizeof(arr)获取数组大小,因为arr退化成了指针。
6. 动态数组(new & delete)
C++ 标准数组大小固定,如果想要动态分配数组,需要使用 new 和 delete:
int* arr = new int[10]; // 动态分配 10 个整数
delete[] arr; // 释放内存
缺点: 需要手动释放,建议使用
std::vector。
7. STL 数组(std::array 和 std::vector)
7.1 std::array(C++11)
#include <array>
array<int, 5> arr = {1, 2, 3, 4, 5};
cout << arr[2]; // 访问元素
优点:
std::array具备普通数组的性能,同时支持size()、at()等成员函数。
7.2 std::vector(可变长数组)
#include <vector>
vector<int> vec = {1, 2, 3};
vec.push_back(4); // 增加元素
vec.pop_back(); // 删除元素
优点: 动态扩展,使用方便。
8. 常见错误与注意事项
| 问题 | 说明 |
|---|---|
| 访问数组越界 | C++ 不检查数组越界,会导致未定义行为 |
传递数组时 sizeof(arr) 失效 | 因为数组会退化为指针,无法获取真实大小 |
new[] 申请的数组没有 delete[] | 导致内存泄漏 |
std::vector 替代普通数组 | 推荐使用 std::vector 以避免数组大小限制 |
9. 参考链接
10. 总结
- 数组是存储相同类型元素的容器,大小固定。
- 一维数组、二维数组的初始化、遍历方式不同。
- 数组名即指针,可与指针操作结合。
- 动态数组用
new和delete,推荐使用std::vector。 std::array和std::vector适用于现代 C++ 开发。
更多详细内容请关注其他相关文章!