C 语言中二维数组的退化
目录
1. 一维数组的退化
2.字符串数组的退化
3. 二维数组的退化
3.1 为什么退化为 int (*)[4] 而不是 int **?
3.2举例说明
3.3 .总结
在 C 语言中,数组名在大多数情况下会退化为指向其第一个元素的指针,这种机制称为数组退化(Array Decay)。不过,这种退化的具体表现取决于数组的维度。详细解释如下:
1. 一维数组的退化
当一维数组作为参数传递给函数时,数组名退化为指向数组第一个元素的指针。
void func(int *arr) {// arr 是指向 int 的指针
}int main() {int arr[5] = {1, 2, 3, 4, 5};func(arr); // arr 退化为 &arr[0],即指向第一个元素的指针return 0;
}
内存布局
假设 arr[5] 的首地址为 0x1000:arr 退化为指向 arr[0] 的指针,即 int *,指向地址 0x1000。
2.字符串数组的退化
当字符串数组(例如 char *array[])作为参数传递给函数时,它会退化为一个指向指针的指针(char **)。这是因为数组名在函数调用时会退化为一个指针,具体过程如下:
作为函数参数时的退化:
1.array 作为参数传递时,它不会直接传递整个数组,而是退化为指向数组首元素的指针。
2.因为数组的每个元素是一个 char *,所以退化后的类型是 char **,表示一个指向字符串指针的指针。
void processArray(char **arr, int size);
void processArray(char *arr[], int size);
使用 char *arr[] 和 char **arr 作为函数参数是等效的
3. 二维数组的退化
二维数组的退化稍微复杂一些。当二维数组作为参数传递给函数时,它退化为指向第一行的指针。由于每一行本身是一个一维数组,结果是一个指向数组的指针。
void func(int arr[][4]) {// arr 是指向包含 4 个 int 的数组的指针,即 int (*)[4]
}int main() {int arr[3][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};func(arr); // arr 退化为指向 arr[0] 的指针return 0;
}
内存布局
假设二维数组 arr[3][4] 的首地址为 0x1000:
arr 退化为指向 arr[0] 的指针,即 int (*)[4],指向地址 0x1000。
arr[0] 是一维数组,包含 4 个 int,每行占用 4 * sizeof(int) 的空间。
3.1 为什么退化为 int (*)[4] 而不是 int **?
二维数组是连续分布的:在内存中,二维数组是一个大的连续内存块。
int ** 表示一个指针的指针,通常用来表示一组独立的指针(比如动态分配的二维数组),但这里 arr 是一个连续的内存块,无法用 int ** 访问。
退化为 int (*)[4] 后,编译器知道每行占用 4 * sizeof(int) 的空间,因此可以正确地解析 arr[i][j]。
3.2举例说明
在函数中:
void process2DArray(char arr[][10], int rows);
这里的 arr 是一个指向数组的指针(char (*)[10]),通过 arr[i] 访问每一行。编译器知道每行是一个长度为 10 的数组,因此可以正确解析 arr[i][j]。
如果改为:
void process2DArray(char **arr, int rows);
这会导致类型不匹配,因为 char ** 不包含关于行长度的信息,无法正确解析 arr[i][j]。
3.3 .总结
1.数组名退化为指针的原因在于函数调用时无法直接传递整个数组。
2.对于二维数组,退化为指向行的指针(char (*)[10]),以便编译器知道行的大小。
3.二维数组与指针数组(char **)有本质不同,因为二维数组是一个连续的内存块,而指针数组是独立的指针集合。
相关文章:
C 语言中二维数组的退化
目录 1. 一维数组的退化 2.字符串数组的退化 3. 二维数组的退化 3.1 为什么退化为 int (*)[4] 而不是 int **? 3.2举例说明 3.3 .总结 在 C 语言中,数组名在大多数情况下会退化为指向其第一个元素的指针,这种机制称为数组退化…...
Notion 推出捏脸应用 | Deving Weekly #15
CEF-Detector-X 现在 Chromium 占据了桌面应用的大壁江山,典型的有 Electron 框架,底层就是基于 Chromium 内核,上百 M 的臃肿包体积一直别人诟病。 CEF-Detector-X 可以检测你电脑有多少个 基于 Chromium 应用,并且会生成一份「…...
C# Linq 查询
1.Linq 查询表达式基础 Linq 查询应用程序始终将源数据视为 IEnumerable<T> 或 IQueryable<T> 集合。 LINQ查询表达式包含8个基本子句,分别为from、select、group、where、orderby、join、let和into。 子 句备注from指定数据源和范围变量select指定当执行查询…...
ES7【2016】、ES8【2017】新增特性
ES7【2016】新增特性 幂指数操作符 在ES7【2016】中新增了幂指数操作,幂指数操作符是**。它用于指数计算 基本语法:baseValue ** exponent 参数说明:baseValue是基数,exponent是指数。 let base 2; let exponent 4; let resul…...
64细分步进电机驱动器TMC2209
封装和丝印 典型电路1 典型电路2 应用 兼容设计升级 3D 打印机 打印机、POS 办公和家庭自动化 纺织、缝纫机 闭路电视, 安保 ATM, 现金回收机 暖 通 空调 电池供电设备 特点和优势 2 相步进电机,线圈电流(峰值)高达…...
C# 获取PDF文档中的字体信息(字体名、大小、颜色、样式等
在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响。然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文档。获取PDF中的字体信息可以解决这个问题,让我们能够更好地处理这些文件。…...
linux 安装PrometheusAlert配置钉钉告警
在 Linux 上安装 PrometheusAlert 并配置钉钉告警的步骤如下: 1. 准备工作 钉钉机器人: 在钉钉群中创建一个机器人,获取 Webhook URL。示例 Webhook URL:https://oapi.dingtalk.com/robot/send?access_token=your_dingtalk_token。PrometheusAlert 安装包: 从 Prometheus…...
【华为路由/交换机的ssh远程设置】
华为路由/交换机的ssh远程设置 R1(client):10.1.1.1 R2(server):10.1.1.2 R2服务端配置: 生成本机密钥 查看生成的密钥 设置AAA授权验证方式,并设置支持SSH协议 创建本地用户&…...
性能测试 - Locust WebSocket client
Max.Bai 2024.10 0. 背景 Locust 是性能测试工具,但是默认只支持http协议,就是默认只有http的client,需要其他协议的测试必须自己扩展对于的client,比如下面的WebSocket client。 1. WebSocket test Client “”“ Max.Bai W…...
html中鼠标位置信息
pageX:鼠标距离页面的最左边的距离,包括滚动条的长度。clientX:鼠标距离浏览器视口的左距离,不包括滚动条。offsetX:鼠标到事件源左边的距离。movementX:鼠标这次触发的事件的位置相对于上一次触发事件的位…...
kubernetes v1.29.XX版本HPA、KPA、VPA并压力测试
序言: 在大型电商、购物、直播活动期间,对于火爆流量的激增,如何保障业务稳定并且做到资源不浪费,自动回收。 场景:kubernetes 原生容器化承载业务流量(非云环境) 方案:kubernetes自…...
flutter 常用UI组件
文章目录 1. Toast 文本提示框oktoastbot_toast2. loading 加载窗flutter_easyloading3. 对话框gex dialog4.下拉刷新pull_to_refresh5. pop 窗custom_pop_up_menu6. pin code 密码框pinput7. 二维码qr_flutter8. swiper 滚动组件carousel_sliderflutter_swiper_view9. Badge 角…...
HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (五、电影详情页的设计实现)
在上一篇文章中,完成了电影列表页的开发。接下来,将进入电影详情页的设计实现阶段。这个页面将展示电影的详细信息,包括电影海报、评分、简介以及相关影人等。将使用 HarmonyOS 提供的常用组件,并结合第三方库 nutpi/axios 来实现…...
hive表修改字段类型没有级连导致历史分区报错
一:问题背景 修改hive的分区表时有级连概念,指字段的最新状态,默认只对往后的分区数据生效,而之前的分区保留历史元数据状态。好处就是修改语句的效率很快,坏处就是如果历史分区的数据还有用,那就回发生分…...
云上贵州多彩宝荣获仓颉社区先锋应用奖 | 助力数字政务新突破
在信息技术应用创新的浪潮中,仓颉社区吸引了众多企业和开发者的积极参与,已有多个应用成功落地,展现出蓬勃的创新活力。仓颉编程语言精心遴选了在社区建设、应用创新、开源共建、技术布道等方面做出突出贡献的优秀项目应用,并颁发…...
JS宏进阶:JS宏中的文件系统FileSystem
FileSystem对象中包含文件和文件夹的一些基本和常见的操作接口。比如:判断路径是否存在、创建文件夹、创建文件、读取文件等等。他的出现可以取代文件流对txt或csv等文件的操作。官方文档网址:https://open.wps.cn/previous/docs/client/wpsLoad…...
XML序列化和反序列化的学习
1、基本介绍 在工作中,经常为了调通上游接口,从而对请求第三方的参数进行XML序列化,这里常使用的方式就是使用JAVA扩展包中的相关注解和类来实现xml的序列化和反序列化。 2、自定义工具类 import javax.xml.bind.JAXBContext; import javax.x…...
npm ERR! code CERT_HAS_EXPIRED
很不幸看到这个提示。 查了很多网上的解决方案,都提到一个解决方案: npm install -g npmlatest 靠就是执行install报的错,你要我通过install来解决这个问题。可见大多数人都是转发,从不自己试试。 第二个是看系统时间。这个基…...
30分钟内搭建一个全能轻量级springboot 3.4 + 脚手架 <5> 5分钟集成好caffeine并使用注解操作缓存
快速导航 <1> 5分钟快速创建一个springboot web项目 <2> 5分钟集成好最新版本的开源swagger ui,并使用ui操作调用接口 <3> 5分钟集成好druid并使用druid自带监控工具监控sql请求 <4> 5分钟集成好mybatisplus并使用mybatisplus generator自…...
【设计模式-结构型】装饰器模式
一、什么是装饰器模式 装饰器模式(Decorator Pattern)是一种结构型设计模式,它的核心思想是在不改变原有对象结构的情况下,动态地给对象增加一些功能,从而达到扩展功能的目的。举个例子,今天在家妈妈给蒸馒…...
03 MongoDB文档的各种增加、更新、删除操作总结
更多内容请见: 《深入掌握MongoDB数据库》 - 专栏介绍和目录 一. 插入文档 注意: 在 MongoDB 中,直接插入内容会自动创建集合! 1.1 使用insert()方法 语法格式: db.COLLECTION_NAME.insert(document) 说明: 若插入的数据主键已经存在,则会抛 org.springframework.dao.Du…...
2026年了,为什么很多企业做了智慧气象,结果还是没把风险降下来?
上个月,和一位新能源集团的运营负责人聊天,他抛出一个百思不得其解的问题:“我们花了300多万上了智慧气象系统,接了精细化预报,预警信息每天推送到手机、电脑、大屏,三个渠道同步。结果上个月一场雷暴&…...
革新性Windows系统管理工具:一站式效能优化与维护解决方案
革新性Windows系统管理工具:一站式效能优化与维护解决方案 【免费下载链接】winutil Chris Titus Techs Windows Utility - Install Programs, Tweaks, Fixes, and Updates 项目地址: https://gitcode.com/GitHub_Trending/wi/winutil Windows系统维护往往让…...
NVIDIA Orin AGX 开发环境快速部署指南
1. 开箱即用:NVIDIA Orin AGX开发环境全景概览 拿到NVIDIA Orin AGX开发板的第一天,我盯着这个黑色的小盒子看了十分钟——它看起来像块普通电路板,但内核却是当前最强的边缘计算芯片之一。作为过来人,我理解新手面对这块板子时的…...
DDS信号发生器设计避坑指南:基于FPGA的AD9767驱动常见问题与优化技巧
FPGA驱动AD9767实战避坑手册:从时序优化到DDS精度提升的进阶技巧 当你在深夜调试FPGA与AD9767的接口时,示波器上那些不规则的毛刺和频率偏差是否曾让你抓狂?作为一款经典的高速14位DAC芯片,AD9767在信号发生、通信系统等领域应用广…...
[iPhone USB网络共享]完全指南:从驱动故障到高效连接
[iPhone USB网络共享]完全指南:从驱动故障到高效连接 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/gh_mirr…...
Local SDXL-Turbo保姆级教程:导出为ONNX格式进一步优化推理速度
Local SDXL-Turbo保姆级教程:导出为ONNX格式进一步优化推理速度 1. 引言:为什么需要导出ONNX? 如果你已经体验过Local SDXL-Turbo那“打字即出图”的畅快感,可能会想:这速度已经很快了,还能不能再快一点&…...
新手入门指南:在快马平台用AI生成代码理解云桌面基础概念
今天想和大家分享一个特别适合新手理解云桌面基础概念的实践方法。作为一个刚接触云计算的小白,我最初对"一台主机创建多个云桌面"这个概念也是一头雾水,直到在InsCode(快马)平台上尝试用AI生成代码来模拟这个过程,才真正搞明白其中…...
StructBERT中文语义匹配实战:一键部署+可视化进度条,小白也能用
StructBERT中文语义匹配实战:一键部署可视化进度条,小白也能用 1. 工具概览:你的中文句子"CT扫描仪" 想象一下,你手上有两份用户反馈:"这个手机电池很耐用"和"这款设备续航能力超强"。…...
DDrawCompat:老游戏兼容性修复与性能优化终极解决方案
DDrawCompat:老游戏兼容性修复与性能优化终极解决方案 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/dd/DDrawC…...
