You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中std::array与普通数组传参差异及std::array传参方法

std::array与普通数组的差异及传参解决方案

两种数组的核心差异

  • 类型本质不同:int arr[5]是C++的内置数组类型,在传递给函数时会自动“退化”为指向首元素的int*指针——这就是你的打印函数能接收普通数组的原因。而std::array<int,5>是标准库提供的模板容器类,它是一个完整的对象,不会自动退化为指针,直接传给期望int*的函数自然会报错。
  • 类型安全性与信息保留:std::array的大小是其类型的一部分(std::array<int,5>和std::array<int,6>是完全不同的类型),函数接收时能完整保留数组的大小信息;普通数组退化为指针后,会丢失长度信息,必须手动传递大小参数才能安全遍历。
  • 功能与接口差异:std::array自带size()、empty()等成员函数,还支持迭代器、范围for等现代C++特性;普通数组只是一块连续内存,没有这些封装好的接口,操作起来更原始。

std::array的正确传参方法

方法1:直接传递std::array对象(推荐)

直接将std::array以const引用的方式传给函数,既能避免拷贝开销,又能保留完整的类型和大小信息,还能使用范围for循环简化遍历:

#include <array>
#include <iostream>

void printArray(const std::array<int, 5>& arr) {
    for (const auto& elem : arr) {
        std::cout << elem << '\n';
    }
}

int main() {
    std::array<int, 5> arr = {1, 2, 3, 4, 5};
    printArray(arr);
    return 0;
}

方法2:适配原有接收指针的函数

如果不想修改已经存在的、接收int*和大小参数的打印函数,可以通过std::array的data()成员函数获取底层数组的指针,同时传递size()获取长度:

#include <array>
#include <iostream>

// 原有打印函数
void printArray(int* arr, int size) {
    for (int i = 0; i < size; ++i) {
        std::cout << arr[i] << '\n';
    }
}

int main() {
    std::array<int, 5> arr = {1, 2, 3, 4, 5};
    // 用data()获取指针,size()获取长度
    printArray(arr.data(), static_cast<int>(arr.size()));
    return 0;
}

方法3:模板化函数适配任意大小的std::array

如果想让打印函数支持任意长度的std::array<int, N>,可以用模板函数自动推导数组大小:

#include <array>
#include <iostream>

template <size_t N>
void printArray(const std::array<int, N>& arr) {
    for (const auto& elem : arr) {
        std::cout << elem << '\n';
    }
}

int main() {
    std::array<int, 5> arr1 = {1, 2, 3, 4, 5};
    std::array<int, 3> arr2 = {6, 7, 8};
    printArray(arr1);
    printArray(arr2);
    return 0;
}

内容的提问来源于stack exchange,提问作者Kanishk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:10:51