导读:本期聚焦于小伙伴创作的《C++如何计算数组长度?sizeof运算符与std::size用法详解》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++如何计算数组长度?sizeof运算符与std::size用法详解》有用,将其分享出去将是对创作者最好的鼓励。

在C++编程中,数组长度的准确计算是很多场景下的基础需求,不同的数组类型和计算方式会带来不同的结果,需要开发者根据具体情况选择合适的方法。

使用sizeof运算符计算数组长度

sizeof是C++中的运算符,用于计算对象或类型在内存中所占的字节数。对于原生数组,我们可以通过总字节数除以单个元素的字节数得到数组长度,这种方式只适用于栈上的原生数组,不适用于指针或动态数组。

基础用法示例

对于明确的原生数组,计算逻辑如下:

#include <iostream>

int main() {
    // 定义原生int数组
    int arr[] = {1, 2, 3, 4, 5};
    // 数组总字节数
    size_t total_bytes = sizeof(arr);
    // 单个元素字节数
    size_t elem_bytes = sizeof(arr[0]);
    // 计算数组长度
    size_t arr_len = total_bytes / elem_bytes;
    
    std::cout << "数组长度: " << arr_len << std::endl;
    return 0;
}

sizeof计算的局限性

当数组退化为指针时,sizeof计算的是指针的大小,而不是数组的大小,这是最容易出现的错误场景:

#include <iostream>

// 函数接收数组参数,实际接收的是指针
void print_arr_len(int arr[]) {
    // 这里arr是指针,sizeof(arr)是指针大小,不是数组总大小
    size_t len = sizeof(arr) / sizeof(arr[0]);
    std::cout << "函数内计算的数组长度: " << len << std::endl;
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    // 正确计算数组长度
    size_t len1 = sizeof(arr) / sizeof(arr[0]);
    std::cout << "main中计算的数组长度: " << len1 << std::endl;
    // 传入函数后计算错误
    print_arr_len(arr);
    return 0;
}

上述代码中,64位系统下指针大小为8字节,int大小为4字节,函数内计算的结果会是2,和实际数组长度5不符。

使用std::size计算数组长度

std::size是C++17标准引入的模板函数,定义在<iterator>头文件中,它可以安全计算原生数组的长度,也能适配标准库容器,比sizeof方式更通用。

基础用法示例

#include <iostream>
#include <iterator> // 引入std::size需要的头文件

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    // 直接使用std::size计算数组长度
    size_t arr_len = std::size(arr);
    std::cout << "std::size计算的数组长度: " << arr_len << std::endl;
    
    // 也支持标准库容器
    std::vector<int> vec = {1, 2, 3};
    std::cout << "vector长度: " << std::size(vec) << std::endl;
    return 0;
}

std::size的实现原理

std::size的核心实现依赖模板参数推导,对于原生数组,会通过模板特化获取数组的长度信息,因此不会出现指针退化的问题:

// std::size的简化实现逻辑
template <typename T, size_t N>
constexpr size_t size(const T (&array)[N]) noexcept {
    return N;
}

可以看到,模板参数N就是数组的长度,直接返回即可,不需要手动做除法运算,也不受指针影响。

两种方式的对比

我们可以通过下面的表格清晰看到两种方式的差异:

对比项sizeof运算符std::size
适用C++版本所有版本C++17及以上
原生数组支持支持,但需手动计算支持,直接返回长度
指针退化场景计算错误编译报错
标准库容器支持不支持支持

使用建议

  • 如果使用C++17及以上版本,优先选择std::size计算数组长度,避免手动计算的错误,同时支持更多类型。
  • 如果使用C++17之前的版本,计算原生数组长度时使用sizeof(arr) / sizeof(arr[0])的形式,注意不要将数组作为函数参数传递后再计算长度。
  • 对于动态数组(如new分配的数组),两种方式都无法直接获取长度,需要额外保存长度信息。
  • 实际开发中如果是存储一组同类型元素,优先使用std::vectorstd::array等标准库容器,它们自带size()方法,不需要额外计算长度。

C++sizeofstd::size数组长度计算修改时间:2026-06-24 22:54:30

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。