• C++
  • C++数组 array 零基础完整教程

  • @ 2026-9-18 19:10:05

C++数组 array 零基础完整教程

区分两个东西:

  1. 普通原生数组 int arr[10]:C语言遗留,C++也能用
  2. 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;
}

原生数组缺点

  1. 不会记录自己长度,容易越界访问
  2. 作为函数参数传递的时候,会退化成指针,丢失长度信息
  3. 不支持直接赋值 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特点总结

  1. 大小编译期固定,创建的时候必须写死大小,不能填变量
int n = 10;
array<int,n> a; // ❌错误!array大小必须是常量

如果想要运行时可变长度,用 std::vector 动态数组。

  1. 不会退化成指针,传给函数不会丢失长度
  2. 支持拷贝、赋值、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;
}

五、常见易错点汇总

  1. 下标从0开始,长度N,下标范围 0 ~ N‑1,访问arr[N]越界,程序崩溃/乱码
  2. std::array大小必须写常量,不能用变量;动态大小用vector
  3. 原生数组不能直接 a=b 整体复制;std::array可以
  4. 原生数组传函数会变成指针,丢失长度,需要手动传长度
  5. at()会检查下标,[]不会检查下标,越界静默出错

练习小任务

可以自己写代码练习:

  1. 创建长度6的int数组,输入6个数字,求全部数字总和
  2. 使用std::array,范围for循环输出全部元素
  3. 二维数组输出3行4列表格

0 条评论

目前还没有评论...