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

数组名的隐式转换规则

在C语言中数组名在绝大多数表达式场景中,会自动转换成指向数组首元素的指针

1.1触发条件

当数组名作为表达式使用时,除两种情况外,都会发生该隐式转换

1.2触发结果

数组名会转化为指向数组首元素的指针,指针的类型由数组元素的类型决定


例外
1.数组名作为sizeof的操作数
2.数组名作为&的操作数


为了便于加深其重要性的理解,我下面举几个例子
下面我用退化代替隐式转换

//这里以32位系统,int占4字节为前提 #include<stdio.h> int main() { int arr[5] = { 0 }; printf("%zu\n",sizeof(arr)); //此时输出的结果为20,数组名作为sizeof的操作数,未发生退化,视为整个数组 printf("%zu\n",sizeof(arr + 1)); //此时输出的结果为4,数组名先与+结合,发生隐式转换视为数组首元素的指针int*,再加一,为指向arr[1]的指针,又是32位系统,所以是4 printf("%zu\n",sizeof(*arr)); //结果为4,arr先与*结合,发生退化,对首元素地址解引用得到首元素,int型,所以结果是4 printf("%zu\n",sizeof(&arr + 1)); //结果为4,arr先与&结合,取出整个数组的地址,类型为数组指针int(*)[5],再加一还是数组指针,相当于跳过了一个含有五个int类型的数组,指针在32位系统下占4个byte return 0; } 我们再来看几个例子 #include<stdio.h> int main() { int arr[3][5] = { 0 }; printf("%zu\n",sizeof(arr)); //未发生退化,是整个二位数组,类型int[3][5],结果为60 printf("%zu\n",sizeof(arr[0][0])); //表示第一个二维数组首元素,int类型,所以结果为4 printf("%zu\n",sizeof(arr[0])); //可视为*(arr + 0),发生退化(当然不这么看也可以,可以理解为下标引用结合后直接是二维数组的首个一维数组的数组名,但这个假想的数组其实没名字,也就是第0行) //arr代表二维数组的第一个元素也就是所谓的第一行的数组int[5]的指针(这和下标引用操作符有关),再+0不变,解引用后就变为了第一行的数组,所以结果为20 //本质上就是表示二维数组的第一个元素,也就是第一行,所以结果为20 printf("%zu\n",sizeof(arr[0] + 1)); //参与表达式运算,arr[0]可以看作计算出了int[5],(不过这个子数组没名字,我就写成这种形式了,上面的例子也是一个道理),参与计算发生衰退,变为指向首元素的指针int* //加一相当于指向了第二个元素(下标是1)的指针,所以结果为4 //第一行参与运算,退化,变为指向第一行的数组指针,加一,变为指向第二行,指针,所以结果为4 printf("%zu\n",sizeof(arr + 1)); //数组名参与表达式运算,发生退化,变为指向首元素的指针int(*)[5],就是第一行(下标为零)加一是第二行,但是是指针,所以结果为4 printf("%zu\n",sizeof(*(arr + 1))); //对第二行的数组指针解引用,得到第二行,结果为20 printf("%zu\n",sizeof(&arr[0] + 1)); //取出第一行的地址,是一个数组指针,加一变为指向第二行的数组指针,结果为4 printf("%zu\n",sizeof(*(&arr[0] + 1))); //对指向第二行的数组指针解引用,得到第二行,结果为20 printf("%zu\n",sizeof(*arr)); //数组名与*结合,退化为首元素的指针,也就是指向第一行的数组指针,解引用得到第一行,结果为20 printf("%zu\n",sizeof(arr[4])); //虽然越界了,但sizeof只看类型,不进行实际的运行,所以结果为20 return 0; }
http://www.gsyq.cn/news/1611645.html

相关文章:

  • FPGA加速数字孪生:GRU算法与硬件优化实践
  • 2026 照片恢复教程|5 种零基础恢复技巧汇总,最后一个90%人不知道!
  • MFile:不止是Minio的“管理中介”
  • Keil MDK vs ARM-GCC(arm-none-eabi-gcc)完整区别
  • 关于ISACA第五届数字信任大会两大权威文件
  • 2026年AI写长篇小说工具终极测评:5款热门工具横评,长篇选手到底选哪个
  • 专访零数科技林乐:他为何坚信“数据利用”比“数据流通”更接近数字经济的本质?
  • 关于 Vaadin:专为企业级应用打造的 Java Web UI 框架
  • 批量处理远程共享目录中的特定类型文件(如 .hex、.csv 等)。
  • 北斗赋能海洋精准定位
  • 【JAVA毕设源码分享】基于springboot大学生社交平台的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 快速部署:三步搞定前后端启动
  • VisualCppRedist AIO:Windows运行库一体化管理的工程化解决方案
  • 计算机视觉实战指南:目标检测、图像分割与识别从入门到部署
  • 国家中小学智慧教育平台电子课本下载工具:解决教师学生离线学习难题
  • 【Ambari Plus】04.HDFS 安装
  • 大模型技术之深度学习
  • AI Agent 新概念: Loop Engineering 是什么? 一篇文章讲清楚定义、组成、应用场景
  • Redis缓存实战:彻底解决缓存穿透、击穿、雪崩三大难题
  • 整群随机抽样
  • 2026 年本地部署的 AI 数字人直播系统到底有多省钱?
  • 从Prompt到Loop,拆解Agent 进化的底层逻辑
  • 北京心商科技发布GEO优化产品 助力企业合规营销
  • 开源模型技术总结-3————FireRed(小红书)开源模型
  • 主流三维光学轮廓仪国产品牌与技术解析
  • 】[SampleVirtualTexture节点]原理解析与实际应用
  • 操作简便吗?8款AI写作辅助网站综合榜,毕业答辩稳了!
  • 2026 在上海如何找一家专业又靠谱的小程序定制开发公司
  • 告别命令行!用JGit在Java项目里优雅地操作Git(附完整API使用示例)
  • 2026最新年版Java八股文,7天背完通过面试