- C++
C++数组 array 零基础完整教程
- @ 2026-9-18 19:10:05
C++数组 array 零基础完整教程
区分两个东西:
- 普通原生数组
int arr[10]:C语言遗留,C++也能用- std::array:C++11 新增的标准数组,更安全,推荐现代C++使用 下面全部代码带详细注释,可以直接复制运行。
一、原生数组(基础必学)
#include <iostream>
using namespace std;
int main()
{
// ========== 1.数组定义 ==========
// 格式:数据类型 数组名[元素个数];
int arr[5]; // 创建可以存放5个int整数的数组,下标:0 1 2 3 4
/*
⚠️重点:数组下标从0开始!
5个元素,下标范围 0~4,不要写 arr[5],会越界报错!
*/
// ========== 2.给数组赋值 ==========
arr[0] = 10; // 第1个位置
arr[1] = 20; // 第2个位置
arr[2] = 30;
arr[3] = 40;
arr[4] = 50;
// ========== 3.初始化的时候直接填值 ==========
int arr2[5] = {1,2,3,4,5};
// 如果大括号里面值少于数组大小,剩下自动填0
int arr3[5] = {1,2};
// arr3[0]=1 arr3[1]=2 arr3[2]=0 arr3[3]=0 arr3[4]=0
// 不写数组大小,编译器自动根据{}里面数量确定长度
int arr4[] = {100,200,300};
// ========== 4.读取数组元素 ==========
cout << arr2[0] << endl; // 取出第0号元素,输出1
cout << arr2[3] << endl; // 取出第3号元素,输出4
// ========== 5.for循环遍历数组 ==========
cout << "循环输出arr2全部元素:" << endl;
for(int i = 0; i < 5; i++)
{
// i就是数组下标,从0到4
cout << arr2[i] << " ";
}
cout << endl;
// ========== 6.计算原生数组元素个数(小技巧) ==========
// sizeof(数组名):整个数组占的字节
// sizeof(数组[0]):单个元素占字节
int len = sizeof(arr2) / sizeof(arr2[0]);
cout << "arr2数组长度 = " << len << endl;
return 0;
}
原生数组缺点
- 不会记录自己长度,容易越界访问
- 作为函数参数传递的时候,会退化成指针,丢失长度信息
- 不支持直接赋值
arr_a = arr_b;
二、std::array C++标准数组(C++11及以上)
std::array 是容器数组,大小固定,比原生数组安全,支持获取长度,可以拷贝赋值。
必须头文件:
#include <array>
#include <iostream>
#include <array> // 使用std::array必须引入这个头文件
using namespace std;
int main()
{
// ======================定义格式======================
// array<数据类型, 元素数量> 数组名;
array<int, 5> arr; // 创建存储5个int的array数组
// 初始化赋值
array<int,5> arr1 = {10,20,30,40,50};
// =====================读写元素=====================
arr[0] = 111; // []访问,和普通数组一样
cout << arr1[2] << endl; // 输出30
// at()访问,如果下标越界,程序直接报错,比[]安全!!
cout << arr1.at(3) << endl;
// =================常用成员函数====================
cout << "数组大小 size():" << arr1.size() << endl; // 返回数组元素个数 5
cout << "数组是否为空 empty():" << arr1.empty() << endl; // false,不为空
cout << "第一个元素 front():" << arr1.front() << endl; // 第一个元素 10
cout << "最后一个元素 back():" << arr1.back() << endl; // 最后一个 50
// fill():全部填充同一个数值
arr.fill(88);
// arr全部变成 {88,88,88,88,88}
// =================遍历数组====================
cout << "普通for循环遍历:" << endl;
for(int i = 0; i < arr1.size(); i++)
{
cout << arr1[i] << " ";
}
cout << endl;
// 范围for循环(C++11新语法,非常好用)
cout << "范围for遍历:" << endl;
for(int x : arr1)
{
cout << x << " ";
}
cout << endl;
// array可以直接整体赋值!原生数组做不到!
array<int,5> arr2;
arr2 = arr1; // 把arr1完整拷贝给arr2
return 0;
}
std::array特点总结
- 大小编译期固定,创建的时候必须写死大小,不能填变量
int n = 10;
array<int,n> a; // ❌错误!array大小必须是常量
如果想要运行时可变长度,用
std::vector动态数组。
- 不会退化成指针,传给函数不会丢失长度
- 支持拷贝、赋值、
at()越界检查,安全性高
三、二维数组(原生二维数组)
表格形式,行和列
#include <iostream>
using namespace std;
int main()
{
// 2行3列数组:2行,每行3个数字
// [行][列],下标全部从0开始
int arr[2][3] = {
{1,2,3},
{4,5,6}
};
// 读取:第0行第2列
cout << arr[0][2] << endl; //输出3
// 修改:第1行第0列
arr[1][0] = 44;
// 双层for循环遍历二维数组
for(int i = 0; i < 2; i++) // i代表行
{
for(int j = 0; j <3; j++) // j代表列
{
cout << arr[i][j] << "\t";
}
cout << endl; // 一行结束换行
}
return 0;
}
std::array 二维写法:
array<array<int,3>,2> arr = {{ {1,2,3}, {4,5,6} }};
四、数组作为函数参数
1)原生数组传参(坑点)
原生数组传入函数,丢失长度信息,必须额外传长度变量
#include <iostream>
using namespace std;
// arr[]本质是指针,数组长度信息没了,需要len参数
void printArray(int arr[], int len)
{
for(int i=0;i<len;i++)
{
cout << arr[i] << " ";
}
}
int main()
{
int a[4] = {1,3,5,7};
int length = sizeof(a)/sizeof(a[0]);
printArray(a, length);
return 0;
}
2)std::array传参(推荐)
array不会丢失大小,可以直接传,还可以用引用避免拷贝
#include <iostream>
#include <array>
using namespace std;
// &引用,不拷贝数组,效率高
void printArr(array<int,5>& arr)
{
for(int x : arr)
{
cout << x << " ";
}
}
int main()
{
array<int,5> test = {2,4,6,8,10};
printArr(test);
return 0;
}
五、常见易错点汇总
- 下标从0开始,长度N,下标范围
0 ~ N‑1,访问arr[N]越界,程序崩溃/乱码 - std::array大小必须写常量,不能用变量;动态大小用vector
- 原生数组不能直接
a=b整体复制;std::array可以 - 原生数组传函数会变成指针,丢失长度,需要手动传长度
at()会检查下标,[]不会检查下标,越界静默出错
练习小任务
可以自己写代码练习:
- 创建长度6的int数组,输入6个数字,求全部数字总和
- 使用std::array,范围for循环输出全部元素
- 二维数组输出3行4列表格
0 条评论
目前还没有评论...