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.rhkb.cn/news/272546.html

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

相关文章

【算法沉淀】最长回文子串

🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《数据结构与算法:初学者入门指南》📘&am…

每日OJ题_路径dp①_力扣62. 不同路径

目录 力扣62. 不同路径 解析代码 力扣62. 不同路径 62. 不同路径 难度 中等 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标…

视频可回溯系统技术方案vue3+ts+tegg+mysql+redis+oss

一、 项目背景 保险、基金、银行等众多行业在做技术平台时都会需要一种能够准确了解用户操作行为的方式方法。诸如通过埋点、平台监控、视频可回溯等,通过技术手段,保存用户操作轨迹,以此规范安全销售、平台健康检查、出现纠纷时可追溯、问题…

chrome插件开发的几种展现页面形式,3分钟看完

想要开发一个chrome浏览器插件,还是很有必要清楚插件都可以在哪些地方显示出来的,比如只想在pop页面弹出,还是添加右键菜单,还是提示桌面通知?还是在哪里展示?有哪些展示方式等 browserAction(浏览器右上角…

免费下载Corel Video Studio 2024-轻松创建令人惊叹的视频!

免费下载Corel Video Studio 2024-轻松创建令人惊叹的视频! Corel Video Studio 2024免费下载Keygen 你厌倦了在视频编辑软件上花大钱吗?别再看了!我们为您提供了完美的解决方案——Corel Video Studio 2024。最棒的部分是什么?…

分享MDN前端结构化技能、实践指南、学习资源

前言 MDN课程为成为一名成功的前端开发人员提供了一个结构化的基本技能和实践指南,以及推荐的学习资源。 先看下让人不得不服的书《宝宝的网页设计》(套装共3册) 宝宝的HTML、宝宝的CSS、宝宝的JavaScript 全球首套中英文宝宝编程启蒙书&a…

计算机网络 八股

计算机网络体系结构 OSI:物理层、数据链路层、网络层、运输层、会话层、表示层、应用层

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Gauge)

数据量规图表组件,用于将数据展示为环形图表。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 可以包含单个子组件。 说明: 建议使用文本组件构建当前数值文本和辅…

【xv6操作系统】xv6 启动过程分析

一、调试用到的汇编代码 为了方便, Makefile 会创建.asm 文件,可以通过它来定位究竟是哪个指令导致了 bug。 可以看到, kernel 从 80000000 地址处开始执行,第二列为相应指令(如 auipc) 的 16 进制表示&a…

缩放算法优化步骤详解

添加链接描述 背景 假设数据存放在在unsigned char* m_pData 里面,宽和高分别是:m_nDataWidth m_nDataHeight 给定缩放比例:fXZoom fYZoom,返回缩放后的unsigned char* dataZoom 这里采用最简单的缩放算法即: 根据比…

猫头虎分享已解决Bug || 系统监控故障:MonitoringServiceDown, MetricsCollectionError

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

如何在一个pycharm项目中创建jupyter notebook文件,并切换到conda环境中

1、第一步可以直接在pycharm项目中创建jupyter notebook文件 2、假若想要切换成pytorch环境做实验例子,会发现报这个错误 Jupyter server process exited with code 1 C:\Users\12430\.conda\envs\pytorch3.11\python.exe: No module named jupyter在这里&#xff…

Python快速入门系列-2(Python的安装与环境设置)

第二章:Python的安装与环境设置 2.1 Python的下载与安装2.1.1 访问Python官网2.1.2 安装Python对于Windows用户对于macOS用户对于Linux用户 2.2 集成开发环境(IDE)的选择与设置2.2.1 PyCharm2.2.2 Visual Studio Code2.2.3 Jupyter Notebook2…

jvm堆概述

《java虚拟机规范》中对java堆的描述是:所有的对象实例以及数组都应当在运行时分配在堆上。 一个JVM实例只存在一个堆内存(就是new 出来一个对象),java内存管理的核心区域 java堆区在jvm启动的时候就被创建,空间大小确定。是jvm管理的最大一…

力扣--滑动窗口438.找到字符串中所有字母异位词

思路分析: 使用两个数组snum和pnum分别记录字符串s和p中各字符出现的次数。遍历字符串p,统计其中各字符的出现次数,存储在pnum数组中。初始化snum数组,统计s的前m-1个字符的出现次数。从第m个字符开始遍历s,通过滑动窗…

STM32_3-1点亮LED灯与蜂鸣器发声

STM32之GPIO GPIO在输出模式时可以控制端口输出高低电平,用以驱动Led蜂鸣器等外设,以及模拟通信协议输出时序等。 输入模式时可以读取端口的高低电平或电压,用于读取按键输入,外接模块电平信号输入,ADC电压采集灯 GP…

C# WinForm AndtUI第三方库 Table控件使用记录

环境搭建 1.在NuGet中搜索AndtUI并下载至C# .NetFramework WinForm项目。 2.添加Table控件至窗体。 使用方法集合 1.单元格点击事件 获取被点击记录特定列内容 private void dgv_CellClick(object sender, MouseEventArgs args, object record, int rowIndex, int columnIn…

一篇搞懂什么是LRU缓存|一篇搞懂LRU缓存的实现|LRUCache详解和实现

LRUCache 文章目录 LRUCache前言项目代码仓库什么时候会用到缓存(Cache)缓存满了,怎么办?什么是LRUCacheLRUCache的实现LRUCache对应的OJ题实现LRUCache对应的STL风格实现 前言 这里分享我的一些博客专栏,都是干货满满的。 手撕数据结构专栏…

解决ts报错:类型“entry”上不存在属性“$AppTools”

uniapp ts 项目,已经将AppTools挂在了vue的原型上,但是在vue页面使用时报错,如图: 解决: 在项目根目录下的tsconfig.json文件添加如下配置: "include": ["src/**/*"],这样报错就消失…

ChatGPT数据分析应用——热力图分析

ChatGPT数据分析应用——热力图分析 ​ 热力图分析既可以算作一种可视化方法,也可以算作一种分析方法,主要用于直观地展示数据的分布情况。接下来我们让ChatGPT解释这个方法的概念并提供相应的案例。发送如下内容给ChatGPT。 ​ ChatGPT收到上述内容后&…