C语言多维数组抽象理解:切格子思维

其实早在两年前我就写过一篇关于多维数组的文章:详解多维数组与指针之间的关系,随着时间的推移,我的工作与学习逐渐深入,对C语言有了更深入的理解,觉得之前写的文章里关于多维数组部分有些复杂,不能以最简单的方式描述出来,我觉得振作厉害的人是能够将一个复杂的知识点用最简单的方式描述出来,一个非常复杂的知识点,当你在解释时任何一个人乃至小学生一听就知道你在说什么,那么说明你这个人的知识能力可以说是达到了一个较高的境界,其实我很早就想写一篇这样的文章,好让大家能更容易理解多维数组,因为本质上其实多维数组的运算速度最简便与快速,但是通常情况下大家只用到了二维,极少有人能用到四维、五维、乃至六维、七维…,其实这个东西在C语言角度来说它是固定的,有一套固定的分配公式的,无论多少维其实对于C语言来说只是一维,一组连续的地址而已,只是通过[]可以快速定位不同段上的地址。
这里我用图文的形式来描述多维数组以便大家能够更好的理解,我把这个思维命名维切格子思维,以方便大家能理解多维数组的原理,首先是一维:
在这里插入图片描述
上图是一个一维数组,大小为2,其存储的数值分别是1、2,其实如果真的要用数组角度来形容它,它真正的实际大小为[2][1],表示有两个格子每个格子里有一个元素,我们扩展一下它,将它扩展为二维数组:
在这里插入图片描述
可以看到刚刚的格子里面多了一个元素,就好像从格子里切了一刀,分出了一个格子一样,存储的元素多了一倍,那么我们在扩维到三维:
在这里插入图片描述
可以看到三维数组和刚刚二维一样,从刚刚切过的每个小格子里在切一刀,就是给每个格子增加了一个小格子,又增加了一倍的维度,让我们在扩维到四维:
在这里插入图片描述
可以看到四维是在每个小格子里又切了一刀,那么五维、六维、七维其实都是如此,不停的在切切切,以上这些这是抽象上的理解,其实内存角度来说就是线性的,通过索引来进行递增得到对饮的数值,如果一开始就从内存角度来说会让人感觉到云里雾里,所以我先以上面这样抽象的方式给大家讲解一下,便于让大家脑海中有一个大体的框架,能够理解多维是怎样的一个计算思路,抽象的理解就是不停的切切切,跟套娃一样,在小格子里不停的切切切。
接下来我用C语言角度来给大家讲解一下,首先用C语言形式来生成一个四维的数组:

int array[2][2][2][2] = 
{{{{1,2},{3,4},},{{5,6},{7,8}}	},{{{{9,10},{11,12},},{{13,14},{15,16}}},
}

当你理解了上面的切格子思维之后就可以很轻松的定义出这样的维度,并且能够轻松的运用它,接下来从索引加图文并茂的形式来给大家一步一步讲解它的寻址过程,我会将选中的颜色标红:
[0]
在这里插入图片描述
[0][1]
在这里插入图片描述
[0][1][0]
在这里插入图片描述
[0][1][0][0]
在这里插入图片描述
最终输出为5
以上就是切格子思维的理解,这是我目前能够想到用最简单的方式来形容多维数组,无论是多少维哪怕一百维就可以用这个思维来理解它,它是有通用逻辑的。
其实在内存角度来说,假设array在内存的首地址是0x40000
那么[0]对应的地址是0x40000,也就是它的首地址,那么[0][1]对应的就是0x40000+(sizeof(array[0][0])*1),需要计算每个格子的总大小,然后按格子来进行计算,[0][1][0]对应的就是0x40000+(sizeof(array[0][0])*1)+(sizeof(array[0][0][0])*0),因为是第0个,*0其实就为0那么得到的就是这段地址的首地址,[0][1][0][0]就是0x40000+(sizeof(array[0][0])*1)+(sizeof(array[0][0][0])*0)+sizeof(array[0][0][0][0]*0),这样就得到5元素,可以看到后面两个其实加的都是0,因为在内存角度来说其实没有格子,格子只是我们抽象的理解,当你使用array[0][1]时,其实它输出的也是5,[0][1]对标[0][1][0][0],如果要从内存角度理解把格子去掉就可以了:
在这里插入图片描述
从内存角度来说,就是连续的,公式就是我刚刚给大家列的:0x40000+(sizeof(array[0][0])*1)+(sizeof(array[0][0][0])*0)+sizeof(array[0][0][0][0]*0),需要注意,array[0][0][0],会返回array[0][0][0]这一行的大小,也就是两个int,sizeof它计算时会将每组的大小全部返回,例如计算array[0],返回的实际上是第一个格子的全部大小:
在这里插入图片描述
也就是这一组的全部大小,如果想获取数组全部大小则把索引去除就可以了sizeof(array),这也是C语言的特性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/9515.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

超越Axure:探索新一代原型设计工具

Axure RP是一款被广泛认可的快速原型设计工具,专为专业设计师打造,用于创建高效的产品原型图,包括APP和网页的原型图、框架图和结构图等。Axure RP制作的原型图能够实现与实际APP相似的交互效果,便于向用户或客户展示,…

PVE纵览-从零开始:了解Proxmox Virtual Environment

PVE纵览-从零开始:了解Proxmox Virtual Environment 文章目录 PVE纵览-从零开始:了解Proxmox Virtual Environment摘要引言什么是Proxmox Virtual EnvironmentPVE的核心功能PVE 优势如何开始使用PVEPVE应用案例总结 关键字: PVE、 虚拟机、…

装杯 之 Linux指令【补充篇】

“生活就像海洋,只有意志坚强的人,才能到达彼岸” ---马克思 目录 1.grep指令 ​编辑 2.zip/unzip指令 3.tar指令(重要):打包/解包,不打开它,直接看内容 4.bc指令 5.uname 指令 1.grep…

AI自动直播软件之直播任务模块开发!

AI自动直播软件,作为现代科技与传统直播行业的完美结合,正在逐步改变我们的生活方式,它不仅能够帮助主播们实现24小时不间断的直播,还能通过智能算法分析观众喜好,推送定制化的内容,极大地提升了用户体验。…

windows工具 -- 开源图片查看器ImageClass

目的 windows自带的图像查看有些不好用 ImageClass效果 下载安装 点击下载 ImageClass https://imageglass.org/releases 双击安装即可 如果想要和一样的布局可以参考 下图布局设置: 其他功能自行探索一下, 功能很丰富

99_api_intro_websitetools_dnslookup

域名 DNS 信息查询 API 数据接口 网络工具,多种记录类型数据返回,丰富的信息结构,毫秒级响应。 1. 产品功能 提供域名 DNS 解析完整记录;丰富的解析记录类型,包括:A, AAAA, MX, TXT, NS, CNAME, SRV, PTR, …

Intern大模型训练营(五):书生大模型全链路开源体系笔记

观看视频,可以比较详细地了解到书生大模型全链路开源体系。 其中有几个印象比较深的点: 这张图讲述了书生浦语大模型开源的发展史,同时与主流的llama和Chatgpt模型进行比较,可以看出在参数上,InterLM在努力追赶甚至超…

ONLYOFFICE 8.2 版:助力自动化办公的佼佼者

0. 引言 在当今数字化办公的浪潮中,办公软件的选择对于提高工作效率和质量至关重要。就像在算法的世界里,合适的算法能高效地解决问题一样,一款优秀的办公软件能为我们的办公流程带来前所未有的便捷。ONLYOFFICE 8.2 版的出现,为…

03集合基础

目录 1.集合 Collection Map 常用集合 List 接口及其实现 Set 接口及其实现 Map 接口及其实现 Queue 接口及其实现 Deque 接口及其实现 Stack类 并发集合类 工具类 2.ArrayList 3.LinkedList 单向链表的实现 1. 节点类(Node) 2. 链表类&a…

6KBhtm+js实现提交名单随机抽取功能适用活动或课堂随机点名

<!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>名单抽奖系统</title> <style> *{ma…

面向对象的需求分析和设计(一)

[toc] 1. 引言 前一篇文章《我对需求分析的理解》提到了面向对象分析和设计&#xff0c;正好最近又重新有重点的读了谭云杰著的《Think in UML》&#xff0c;感觉有必要写把书中一些核心内容观点以及自己的想法整理出来&#xff0c;一是方便自己日后的复习&#xff0c;另外也…

树的存储结构-树,二叉树,森林的相互转换

双亲表示法存储树 优点:查找指定结点的双亲十分方便 缺点:查指定结点的孩子只能从头遍历 插入操作:插入对位无须按照某种顺序 删除操作1:将指定结点的parent数据赋值为-1表示为空(删除节点为叶子节点) 删除操作2:将最后一个数据覆盖到指定结点的数据域(删除节点为叶子节点…

OpenGL学习笔记(四) RGBA颜色

RGBA模式中&#xff0c;每一个像素会保存以下数据&#xff1a;R值&#xff08;红色分量&#xff09;、G值&#xff08;绿色分量&#xff09;、B值&#xff08;蓝色分量&#xff09;和A值&#xff08;alpha分量&#xff09;。其中红、绿、蓝三种颜色相组合&#xff0c;就可以得到…

机器学习2_支持向量机_线性可分——MOOC

目录 定义 线性可分&#xff08;Linear Separable&#xff09; 线性不可分&#xff08;Nonlinear Separable&#xff09; 数学化定义 问题描述 优化问题 线性可分定义 假定训练样本集是线性可分的 1、最小化&#xff08;Minimize&#xff09;&#xff1a; 2、限制条件…

零基础学习Spring AI Java AI使用向量数据库postgresql 检索增强生成 RAG

零基础学习Spring AI Java AI使用向量数据库postgresql 检索增强生成 RAG 向量数据库是一种特殊类型的数据库&#xff0c;在人工智能应用中发挥着至关重要的作用。 在向量数据库中&#xff0c;查询与传统的关系数据库不同。它们不是进行精确匹配&#xff0c;而是执行相似性搜…

口子查好做吗?有什么特点?

大家好&#xff0c;我是橙河老师&#xff0c;一家问卷公司老板&#xff0c;今天讲一讲“口子查好做吗&#xff1f;有什么特点&#xff1f;” 1.口子查是公开性资源&#xff0c;由国外问卷公司直接发布在主流的平台上&#xff0c;比如我们的抖音、百度这些平台&#xff0c;竞争…

开放式耳机性价比排行榜:从入门到高端的全方位推荐

在购买开放式耳机时&#xff0c;性价比是一个重要的考虑因素。开放式耳机性价比排行榜可以为我们提供从入门到高端的全方位推荐。但是&#xff0c;在关注排行榜的同时&#xff0c;我们也不能忽视一些关于开放式耳机的谣言&#xff0c;如对耳朵有伤害、完全不漏音、是否适合所有…

计算机毕业设计Spark+大模型知识图谱中药推荐系统 中药数据分析可视化大屏 中药爬虫 机器学习 中药预测系统 中药情感分析 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

WEB:如何优化大数据菜单展示的攻略指南

1、简述 在前端开发中&#xff0c;树结构菜单是常见的 UI 组件&#xff0c;尤其是在展示层级复杂、数据量庞大的场景下。如何优化大数据量的树结构菜单展示&#xff0c;提高性能和用户体验&#xff0c;是一个值得探讨的话题。本文将介绍一些优化技术和实践&#xff0c;帮助开发…

MySQL表的增删改查(CRUD3约束)

这次我们开始先不复习嗷&#xff0c;等到把数据表的删除说完咱们统一&#xff0c;总结书写 1.数据表的删除&#xff1a; 语法&#xff1a; 1. 使用 DROP TABLE 语句删除单个表 基本语法&#xff1a;DROP TABLE [IF EXISTS] table_name; table_name是要删除的表的名称。IF EXIS…