当前位置: 首页 > news >正文

数组名不是指针!一文搞懂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++
http://www.cnnetsun.cn/news/4319991.html

相关文章:

  • MATLAB语音滤波设计全解析:从加噪到频谱分析及滤波器实现
  • Runway AI峰会解读:AI视频生成从模型工具走向可控工作流
  • Duranta——一个开放的、研究级的RAN+UE参考协议栈
  • 1天速通计算机二级C语言:高频考点与上机题模板实战
  • VS Code 中只关闭 AI 生成提交消息而不禁用 Copilot 的完整指南
  • 毕业之家怎么用?论文初稿粘贴降重、对照查重报告针对性降重、定稿保格式,一篇说清
  • 基于STM32F103C8T6的步进电机控制与仿真完整教程
  • Grok Bot开发实战:从API接入到代购订单自动化
  • 815信号与系统考研真题解析:卷积、傅里叶与拉普拉斯变换全攻略
  • Unity游戏项目收尾实践:从玩法闭环到构建发布
  • 终端效率革命:用fd、fzf、bat和rg打造极速文件搜索与代码定位流水线
  • 跑团Replay制作全流程:从录音转写到AI立绘与批量合成
  • AI Agent安全边界:沙箱、权限与审批机制的工程实践
  • GLM 5.3 Flash接入效果差?智能体层才是决定上限的关键
  • 在边缘计算中协作回归学习的分布式ADMM方法附Matlab代码
  • Spring高手之路19——Spring AOP注解指南
  • 贝壳算法笔试2023届卷2解析:KMP、BM25与优化算法全梳理
  • Java + Spring 实现 Hermes Agent:从源码看多模型接入、子代理、人审与沙箱
  • 信号与系统公式:从死记硬背到逻辑翻译的实战指南
  • 网易深度学习算法笔试复盘:核心考点与避坑指南
  • 13年前MV修复成4K中字版:AI超分与人脸增强完整流程
  • 【MySQL】快速上手:mysql用户管理 教你快速创建管理新用户
  • Shell脚本实战:从基础语法到自动化运维脚本编写
  • 老CPU无SSE4.2?用Wine和替代方案让微信在Linux上跑起来
  • 从零开始学Java:一份面向初学者的学习路线图
  • 高级 RAG 架构演进:GraphRAG、自适应检索与多模态检索实战
  • 基于STM32的智能控温水杯设计:硬件、PID与低功耗全解析
  • 相机标定原理与实操:从张正友标定法到OpenCV畸变校正
  • 广工809信号与系统考研:从章节到得分点的高效复习法
  • GDScript Lambda表达式:从匿名函数到高阶回调的Godot实战指南