sizeof辨析——二维数组(超级详细)

二维数组加sizeof的知识如果基础不扎实,上面的代码恐怕很难区分,这篇文章就深度解析一下有关问题

我们在分析之前,要提及一些基础的前提知识

前提知识:

一:

&数组名 和 sizeof(数组名)这两个例外中,数组名代表整个数组

除此之外所有的数组名都是表示首元素的地址

二:

我们直观以为的二维数组储存方式

实际计算机二维数组储存方式

也就是说:它们之间的地址是连续的!

三:

公式:    *(数组名+自然数)== 数组名[自然数]

例如:

*(arr+1)==arr[1]

四:

地址的大小分环境,如果在x86(也就是32位环境下),大小为4个字节

如果在x64(也就是64位环境下),大小为8个字节

五:

sizeof()的()中的不参与编译运算

小练习

分析之前我们先来尝试思考一些简单一点的问题,避免一上来分析题目犯迷糊,容易绕晕

int arr[3][4]

第一类:

sizeof(arr) 

sizeof(arr[0])

sizeof(arr[0][0])

很简单吧,首先上面这三个都符合前提知识的第一条,所以这些数组名都代表整个数组

arr代表的是整个二维数组,所以sizeof(arr)就代表整个二维数组的大小,就是3*4*4=48字节(因为int类型大小为4个字节)

arr[0]代表的是在二维数组中,第一行的一维数组,所以sizeof(arr[0])也就是整个第一行的大小,就是4*4=16字节

arr[0][0]代表的是在二维数组中,第一行的一维数组中的第一个元素,所以sizeof(arr[0][0])就代表该元素的大小,就是4个字节

第二类:

sizeof(arr+1)

sizeof(&arr+1)

在这一类中,sizeof(arr+1)格式为sizeof(数组名+1),而不为sizeof(数组名),所以这里的arr不属于两个例外,即不是代表整个数组,而是首元素地址

又因为二维数组的首元素地址为arr[0],所以此时arr就相当于第一行的一维数组的起始地址,所以arr+1为第二行的一维数组的起始地址,因为是地址,所以大小为4或者8字节

如果有点迷糊的话,可以这么简单理解:

二维数组分为三个层次

最高层次:二维数组

中间层次:一维数组

最低层次:一维数组的元素

而首元素地址就相当于降一级(也就是不符合sizeof(数组名)和&(数组名)格式的降级)

二维数组的首元素地址就为第一行的一维数组的起始地址

一维数组的首元素地址就为第一个元素的地址

然后sizeof(&arr+1)格式为sizeof(&(数组名)+1),虽然不符合sizeof(数组名)的格式,但是符合&(数组名)的格式,所以这里的arr代表整个二维数组,二维数组加1就相当于跳过整个二维数组,来到最后一行的一维数组的最后一个元素后面的那个地址,因为是地址,所以大小为4或者8字节

分析题目

1.  sizeof(a),符合格式sizeof(数组名),所以这里的a代表整个二维数组,所以为3*4*4=48字节

(起始a为最高层次)

2.  sizeof(a[0][0]),这里a[0][0]代表二维数组中第一行的一维数组的第一个元素,所以为4个字节

(起始a[0][0]为最低层次)

3.  sizeof(a[0]),符合格式sizeof(数组名),所以这里a[0]代表二维数组中第一行的整个一维数组,所以为4*4=16字节

(起始a[0]为中间层次)

4.  sizeof(a[0]+1),这里a[0]+1不符合sizeof(数组名)的格式,所以这里的a[0]代表二维数组中第一行一维数组的首元素地址,又因为我们说过首元素地址相当于降一级,所以a[0]代表了二维数组中第一行一维数组的第一个元素的起始地址,a[0]+1就是第一行的一维数组的第二个元素的地址,因为是地址,所以为4或者8字节

(起始a[0]为中间层次,首元素降级变为最低层次)

5.  sizeof( * (a[0]+1) ),根据前提知识的第三条的公式可知, * (a[0]+1)  == a[0][1],代表二维数组中第一行的一维数组的第二个元素,所以为4个字节

(起始a[0]为中间层次,首元素降级变为最低层次)

6.  sizeof(a+1),不符合sizeof(数组名)的格式,所以这里的a代表二维数组的首元素地址,又因为我们说过首元素地址相当于降一级,所以a代表了二维数组中第一行的一维数组的起始地址,则a+1代表二维数组中第二行的一维数组的起始地址,所以为4或者8字节

(起始a为最高层次,首元素降级变为中间层次)

7.  sizeof( *(a+1) ),根据前提知识的第三条的公式可知,*(a+1) ==  a[1],代表二维数组中第二行的整个一维数组,所以大小为4*4=16字节

(起始a为最高层次,首元素降级变为中间层次)

8.  sizeof( &a[0]+1 ),符合&(数组名)的格式,所以这里的a[0]代表二维数组中第一行的整个一维数组,&a[0]就为二维数组中第一行的一维数组的起始地址,&a[0]+1代表二维数组中第二行的一维数组的起始地址,因为是地址,所以为4或者8个字节

(起始a[0]为中间层次,因为符合&(数组名),所以没有降级,还是中间层次)

9.  sizeof( *(&a[0]+1 )),(&a[0]+1 )与上面分析一样,所以解引用后表示二维数组中第二行的整个一维数组,所以为4*4=16字节

(起始a[0]为中间层次,因为符合&(数组名),所以没有降级,还是中间层次)

10.  sizeof(*a),不符合sizeof(数组名)的格式,所以这里的a代表二维数组的首元素地址,又因为我们说过首元素地址相当于降一级,所以a代表了二维数组中第一行的一维数组的起始地址,解引用后表示二维数组中第一行的整个一维数组,所以为4*4=16字节

(起始a为最高层次,首元素降级变为中间层次)

11. sizeof(a[3]),虽然二维数组为a[3][4],不存在a[3],但是我们前提知识的第五条说过,()中的不参与编译运算,所以我们编译运行时也不会报错,计算机可以通过我们定义的二维数组类型推断出长度,符合sizeof(数组名)的格式,所以a[3]代表二维数组中第四行的整个一维数组,所以为4*4=16字节

(起始a[0]为中间层次)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS3基础2

CSS3 用户界面 resize 示例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>…

MybatisPlus知识点总结(基于黑马2023MybatisPlus课程)

MybatisPlus知识点总结 配套资料 黑马微服务框架笔记&#xff0c;内含mpMybatisPlus.pptxMyBatis-Plus &#xff08;mp中文官网&#xff09; 快速入门 入门案例 使用MybatisPlus的基本步骤&#xff1a;1.引入MybatisPlus依赖&#xff0c;代替Mybatis依赖2.定义Mapper接口并继…

代码随想录算法训练营第36天—动态规划04 | ● 背包问题 ● 01背包 ● 滚动数组 ● 416. 分割等和子集

背包问题 常见的背包问题类型&#xff08;大厂面试重点掌握01背包和完全背包即可&#xff09;题目描述&#xff1a;有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品能用*次&#xff0c;求解怎么装物品使得装入…

Echarts 报提示 There is a chart instance already initialized on the dom.

问题原因&#xff1a; 每次执行 Echarts图例方法都会拿到相关的dom元素执行Echarts图例初始化操作 但是每次执行的时候拿到的dom元素又是相同的&#xff0c;Echarts初始化执行的时候检查到这个dom上面已经有了一个 图表了 就不会再重新拿到这个dom元素执行初始化操作 解决方案&…

Vue.js数据绑定解密:深入探究v-model和v-bind的原理与应用

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; Vue.js数据绑定解密&#xff1a;深入探究v-model和v-bind的原理与应用 一、引言 Vue.…

如何打sap NOTE

文章目录 1 Introduction2 Method2.1 search note2.2 download note2.3 upload note 3 Summarry 1 Introduction SAP Notes is a set of instructions to remove known errors from the SAP systems. Using the Note Assistant tool, SAP Notes can be applied to the system.…

云服务器Linux环境部署mall电商项目完整实践教程

云服务器Linux环境部署mall电商项目完整实践教程 引言JDK8 安装Docker 环境安装MySQL安装rpm 包安装 Mysql5.7 Redis 安装RabbitMQ 安装ElasticSearch 与 Kibana 安装MongoDB安装Nacos 安装安装 Nginx 服务部署后端SpringCloud微服务jar包站点效果结语阿里云服务器推荐 引言 在…

文献阅读:DEA-Net:基于细节增强卷积和内容引导注意的单图像去雾

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读&#xff1a;DEA-Net&#xff1a;基于细节增强卷积和内容引导注意的单图像去雾1、研究背景2、方法提出3、相关知识3.1、DEConv3.3、多重卷积的…

python 基础知识点(蓝桥杯python科目个人复习计划61)

今日复习内容&#xff1a;想到什么复习什么 因为比赛用到的编辑器是IDLE&#xff0c;所以从现在开始&#xff0c;我就不用pycharm了。 例题1&#xff1a; 从1到2020的所有数字中&#xff0c;有多少个2&#xff1f; 这个题是一个填空题&#xff0c;我用的方法是先在编辑器上…

python自动化测试如何做数据缓存 ?这个第三方包推荐给你,方便又简单!

1.数据缓存说明 数据缓存可以说也是项目开发中比不可少的一个工具 &#xff0c;像我们测试的系统中 &#xff0c;你都会见到像Redis一样的数据缓存库 。使用缓存数据库的好处不言而喻&#xff0c;那就是效率高 &#xff0c;简单数据直接放在缓存中 &#xff0c;存取简单方便 。…

好物周刊#47:快捷启动器

https://github.com/cunyu1943 村雨遥的好物周刊&#xff0c;记录每周看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;每周五发布。 一、项目 1. Tianji All-in-One 的数据洞察中心&#xff0c;同时具备网站分析器 状态监控器 服务状态上报的功能。 2. Ip2…

论文笔记:Efficient Training of Language Models to Fill in the Middle

导语 Decoder-only的模型只能从左向右看&#xff0c;无法利用双向信息完成填空等操作&#xff0c;本文是OpenAI最早提出使用Fill-in-the-model到Autoregressive形式的模型中的文章&#xff0c;启发了后面一些Text-to-Code的大模型&#xff0c;比如InCoder&#xff0c;SantaCod…