news 2026/8/31 4:34:00

数组名不是指针!一文搞懂C语言数组退化与sizeof陷阱

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数组名不是指针!一文搞懂C语言数组退化与sizeof陷阱

先问你一个很现实的问题:去面试 C 语言岗位,笔试里出现int a[5];int *p = a;,接着问你sizeof(a)sizeof(p)分别是多少,你能立刻答对吗?

很多人的第一反应是“数组名不就是指针吗,那 sizeof 结果应该一样”。结果在sizeof&a+1、函数传参这几个经典考点上反复丢分。

能理解为什么这么容易混淆。因为 C 语言里数组名和指针确实“长得太像了”:数组名可以赋值给指针,可以参与指针运算,连a[i]都可以等价写成*(a + i)。于是很多人干脆背一个粗暴口诀:数组名就是指针。这个口诀在 90% 的代码场景里都能用,但剩下 10% 恰恰是笔试和面试最喜欢挖坑的地方。

准确的说法是:数组名不是指针,它只是在大多数表达式中会自动转换成指向首元素的指针。这个转换在 C 语言里叫“数组退化”(array decay)。真正决定面试答案的,不是你背了多少结论,而是你搞清楚哪些场景会触发退化,哪些场景不会。

本文会从 C 语言类型系统的角度,把数组名和指针的核心差异拆开讲清楚,覆盖sizeof、取地址、指针加减、二维数组、函数形参这些高频考点,并给出一套可以直接编译运行的示例代码。读完你会形成一种判断方法:看到任何数组名表达式,先确定它的类型,再往下推导结果。

1. 先从一道面试题说起:数组名到底是不是指针

先放一道非常经典的题目。定义如下:

int a[5] = {1, 2, 3, 4, 5}; int *p = a;

现在有四个问题:

  1. sizeof(a)sizeof(p)分别是多少?
  2. a == p成立吗?
  3. a++p++都能编译吗?
  4. &a&p的类型分别是什么?

很多人第一眼会觉得:a 和 p 都能表示数组首元素地址,那这四个问题应该差不多。但正确答案是:

  1. sizeof(a)20(假设 int 占 4 字节),sizeof(p)8(64 位平台上指针占 8 字节)。
  2. a == p在大多数表达式里成立,因为a会退化成int*,和p的值相等。但要注意,这个比较成立的前提是“a 发生了退化”。
  3. a++
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/31 4:33:33

MATLAB语音滤波设计全解析:从加噪到频谱分析及滤波器实现

简介:本资源是一套基于MATLAB实现的语音滤波系统程序,面向计算机、通信、人工智能及自动化等专业的学生、教师与工程实践者,解决语音信号中噪声抑制与频带选择的实际问题,适用于课程设计、大作业及毕业设计等教学与实践场景。压缩…

作者头像 李华
网站建设 2026/8/31 4:33:29

Runway AI峰会解读:AI视频生成从模型工具走向可控工作流

Runway AI 峰会公布了新增演讲嘉宾阵容。表面上看,这只是一条常规的发布会预热动态;但放到 AI 视频生成这个赛道上,它值得专门拆开来说。原因很简单:Runway 是目前影响 AI 视频生成方向的关键平台之一,其峰会上出现的人…

作者头像 李华
网站建设 2026/8/31 4:31:00

Duranta——一个开放的、研究级的RAN+UE参考协议栈

基于 OpenAirInterface 软件构建,由 LF Networking 托管,旨在加速 Open RAN 创新。 https://lfnetworking.org/projects/duranta/LF Networking 与 OpenAirInterface 软件联盟 (OSA) 共同创建了一个新的孵化项目,旨在推进开源 CU/DU 和 UE 的…

作者头像 李华
网站建设 2026/8/31 4:30:36

1天速通计算机二级C语言:高频考点与上机题模板实战

这次我们来看一个很现实的复习需求:距离计算机二级 C 语言考试只剩 1 天,从零开始还能不能过?如果按照常规思路去啃教材、看长视频、背语法,那肯定来不及。但如果把复习目标换成“抓选择题高频考点 练熟三道程序题套路”&#xf…

作者头像 李华
网站建设 2026/8/31 4:30:11

VS Code 中只关闭 AI 生成提交消息而不禁用 Copilot 的完整指南

我之前遇到过一件很拧巴的事:VS Code 里装了 GitHub Copilot 之后,写代码时的补全和聊天体验确实不错,但提交代码时,那个“Generate Commit Message”的按钮就像贴在我眼皮上一样。点一下,它确实能生成一条提交信息&am…

作者头像 李华