C++ 指针和数组名一样吗 C++ sizeof结果不同的原因【基础】
发布时间 - 2026-01-27 00:00:00 点击率:次数组名不是指针但可隐式转换为指针;sizeof(arr) 返回数组总字节,sizeof(p) 返回指针大小;仅当作为sizeof、&操作数或字符串初始化时数组名不退化。
数组名不是指针,但能隐式转成指针
数组名在大多数表达式中会“退化”为指向首元素的指针,但这只是隐式转换,不是它本来就是指针。比如 int arr[5],arr 本身是类型为 int[5] 的左值,不是 int*;只有在做算术、赋值给指针变量等场景下,编译器才自动把它转成 &arr[0]。
一个关键证据:对数组名取地址——&arr 的类型是 int(*)[5](指向整个数组的指针),而 &arr[0] 或 arr(退化后)的类型才是 int*。这两个地址数值相同,但类型和含义完全不同。
sizeof(arr) 和 sizeof(p) 结果不同的根本原因
sizeof 是编译期运算符,结果取决于操作数的**静态类型**,不关心运行时值。所以:
-
sizeof(arr)中arr类型是int[5]→ 结果是5 * sizeof(int)(通常是 20) -
sizeof(p)中p类型是int*→ 结果是该平台指针大小(通常是 4 或 8) - 即使写
int* p = arr;,p仍是纯指针,sizeof(p)不会“记住”它曾指向数组
注意:sizeof 对函数参数里的数组形参也失效——因为形参 void f(int a[10]) 实际等价于 void f(int* a),sizeof(a) 永远是指针大小。
什么时候数组名不能退化成指针?
只有三种情况数组名保持原类型(不退化),此时 sizeof 才能拿到真实长度:
- 作为
sizeof的操作数(如sizeof(arr)) - 作为一元
&的操作数(如&arr) - 作为字符串字面量初始化数组时(如
char s[] = "abc";,sizeof(s)是 4,含 '\0')
其他所有地方——传给函数、参与加法、用在 if 判断里、赋值给指针变量——都会退化。这也是为什么 std::array 和 std::vector 更安全:它们把大小信息封装进类型或对象内,不会意外丢失。
容易踩的坑:用指针模拟数组时的 sizeof 误判
新手常写类似这样的代码:
void process(int* p) {
size_t n = sizeof(p) / sizeof(*p); // 错!n 永远是 1(或更糟,是 2/4/8)
// ...
}
int arr[100];
process(arr); // 传进去的是退化后的 int*
这会导致逻辑错误甚至越界访问。正确做法是显式传入长度:
- 加一个
size_t len参数 - 改用
std::span(C++20)或std::vector - 若必须用原始数组,只在定义作用域内用
sizeof(arr)/sizeof(arr[0])
真正的难点不在语法,而在于时刻意识到:数组名的“身份”在不同上下文中会切换,而 sizeof 是唯一能抓住它“本体”的工具——可惜它只在编译期有效,且极易被作用域和参数传递破坏。
# 字节
# 工具
# c++
# 作用域
# 隐式转换
# 为什么
# Array
# 运算符
# if
# 封装
# 字符串
# char
# int
# void
# 指针
# 形参
# len
# 对象
# 数组名
# 隐式
# 转成
# 中会
# 装进
# 的是
# 结果是
# 才是
# 什么时候
# 把它
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何使用查询构建器?(Query Builder高级用法)
php结合redis实现高并发下的抢购、秒杀功能的实例
Laravel中的Facade(门面)到底是什么原理
Laravel如何实现模型的全局作用域?(Global Scope示例)
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
海南网站制作公司有哪些,海口网是哪家的?
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】
Python文件流缓冲机制_IO性能解析【教程】
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
JavaScript如何操作视频_媒体API怎么控制播放
如何用腾讯建站主机快速创建免费网站?
个人摄影网站制作流程,摄影爱好者都去什么网站?
如何在建站之星绑定自定义域名?
如何在服务器上配置二级域名建站?
如何在建站宝盒中设置产品搜索功能?
北京企业网站设计制作公司,北京铁路集团官方网站?
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
北京网站制作的公司有哪些,北京白云观官方网站?
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
网站制作免费,什么网站能看正片电影?
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
JavaScript如何实现倒计时_时间函数如何精确控制
Laravel如何使用Collections进行数据处理?(实用方法示例)
网站制作价目表怎么做,珍爱网婚介费用多少?
如何在腾讯云免费申请建站?
Python数据仓库与ETL构建实战_Airflow调度流程详解
如何彻底删除建站之星生成的Banner?
如何在IIS7上新建站点并设置安全权限?
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
nodejs redis 发布订阅机制封装实现方法及实例代码
中国移动官方网站首页入口 中国移动官网网页登录
昵图网官方站入口 昵图网素材图库官网入口
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
网站制作报价单模板图片,小松挖机官方网站报价?
Laravel怎么连接多个数据库_Laravel多数据库连接配置
Laravel如何实现多对多模型关联?(Eloquent教程)
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
在centOS 7安装mysql 5.7的详细教程
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
Laravel如何使用Blade组件和插槽?(Component代码示例)
Android Socket接口实现即时通讯实例代码
网站制作大概多少钱一个,做一个平台网站大概多少钱?


