0

0

C++怎么获取数组长度_C++计算数组元素个数【技巧】

冰火之心

冰火之心

发布时间:2026-03-16 14:38:03

|

570人浏览过

|

来源于php中文网

原创

sizeof(arr)/sizeof(arr[0])仅对栈上定义的原生数组有效,函数参数中数组会退化为指针导致失效;std::size(C++17起)语义更清晰但同样不适用于指针;动态分配数组无内置长度,须自行保存。

c++怎么获取数组长度_c++计算数组元素个数【技巧】

sizeof 算静态数组长度,但只对栈上定义的数组有效

编译期就知道大小的数组(比如 int arr[5];),sizeof(arr) / sizeof(arr[0]) 是最常用也最可靠的写法。它本质是让编译器把整个数组当做一个连续内存块来算体积,再除以单个元素大小。

常见错误现象:sizeof(arr) 在函数参数里返回指针大小(通常是 8),导致结果永远是 1 或 0 —— 因为数组传参会退化成指针,丢失长度信息。

  • 只在定义该数组的作用域内用,比如函数内部直接定义的数组
  • 不能用于 new int[5]std::vector 或函数形参中的数组名
  • 注意类型一致性:sizeof(arr[0]) 比硬写 sizeof(int) 更安全,避免改类型后漏改

std::size(C++17 起)更简洁,但同样不适用于指针

std::size 是标准库提供的包装函数,底层还是靠 sizeof 实现,语义更清晰,可读性略好。但它和手写 sizeof 一样,依赖数组类型未退化。

使用场景:你用的是 C++17 或更新标准,且确定数组没被当作指针传递。

立即学习C++免费学习笔记(深入)”;

  • std::size(arr)sizeof(arr)/sizeof(arr[0]) 少出错,尤其对复杂类型(如 struct 数组)
  • std::arraystd::vector 也有效,但行为不同:std::vector 返回当前元素个数(运行时),而原生数组仍是编译期计算
  • 如果误用于指针(比如函数参数),编译失败(SFINAE 友好),比运行时出错更容易发现

函数里怎么安全拿到数组长度?别传裸数组,改用引用或容器

一旦数组作为参数传进函数,sizeofstd::size 都失效。这不是技巧问题,是 C++ 类型系统的根本限制。

社研通
社研通

文科研究生的学术加速器

下载

最容易踩的坑:写一个通用函数,试图用模板 + sizeof 自动推导长度,却忘了模板实参推导对数组退化无能为力。

  • 推荐方案:用数组引用传参,例如 template<size_t n> void foo(int (&arr)[N])</size_t>,此时 N 可被推导,std::size(arr) 也能用
  • 更现代做法:直接用 std::array<int></int>std::vector<int></int>,前者长度编译期固定,后者用 .size() 获取运行时长度
  • 绝对避免:在函数内部对形参做 sizeof 运算 —— 它永远不是你想要的“元素个数”

动态分配数组(new[])根本没有内置长度,必须自己记

int* p = new int[10]; 分配后,C++ 不保存这个 10。语言层面没有机制从 p 反查长度,sizeof(p) 是指针大小,std::size(p) 编译不过。

性能影响:有人想用 operator new[] 的实现细节去“偷看”头部长度字段,这属于未定义行为,不同编译器/平台结果不一致,调试器都可能显示错乱。

  • 唯一可靠方式:分配时把长度存在配套变量里,比如 int* p = new int[n]; size_t len = n;
  • 更安全替代:用 std::vector,它内部封装了长度管理,.data() 还能拿到原始指针
  • 如果必须用裸 new[],记得 delete[] 时也得靠自己存的长度,别指望运行时补救

真正麻烦的地方不在怎么算,而在于什么时候“不能算”——数组一离开定义它的作用域,或者一变成指针,所有编译期技巧就全部失效。这时候硬要找“万能函数”,不如花两秒改成 std::arraystd::vector

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1071

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

617

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

335

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

235

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

188

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

135

2025.11.27

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

448

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

606

2023.08.10

C++多线程并发控制与线程安全设计实践
C++多线程并发控制与线程安全设计实践

本专题围绕 C++ 在高性能系统开发中的并发控制技术展开,系统讲解多线程编程模型与线程安全设计方法。内容包括互斥锁、读写锁、条件变量、原子操作以及线程池实现机制,同时结合实际案例分析并发竞争、死锁避免与性能优化策略。通过实践讲解,帮助开发者掌握构建稳定高效并发系统的关键技术。

4

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.4万人学习

C 教程
C 教程

共75课时 | 5.5万人学习

C++教程
C++教程

共115课时 | 22.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号