关于二维数组取地址加以或减一解引用问题

int main() 
{ int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };  int *ptr1 = (int *)(&aa + 1);  int *ptr2 = (int *)(*(aa + 1));    printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));system("pause");return 0;
}

很显然aa是一个二维数组,很多人把二维数组抽象的理解成一个矩阵,如

[1,2,3,4,5],
[6,7,8,9,10],

不能说这是错误,这种思维不利于对二维数组更好地理解,那我们该怎么理解呢?维度是空间的一个概念,我们可以抽象的理解为二维空间是由一维空间组成,三维空间是由二维空间组成,同理,二维数组,其实是由多个一维数组组成的,这个二维数组是两行五列,就是说这个二维数组是由2个元素个数为5的一维数组组成,设这两个一维数组为b[5],c[5],令b[5]={1,2,3,4,5},c[5]={6,7,8,9,10}。接下来开始分析代码:

int *ptr1 = (int *)(&aa + 1);

这个&aa+1怎么理解呢?&aa指二维数组aa的地址,&aa+1就是指向下一个数组的首地址(在这里我们可以形象的理解为元素aa[2][5]的地址,很显然aa[2][5]已经越界了,这里只是便于理解而特殊引用的),然后将其进行int*强制转换赋给ptr1。

int *ptr2 = (int *)(*(aa + 1)); 

aa在单独使用时代表数组aa的首地址,加一表示首地址加一,即指向下一个元素地址,即第二个元素地址(即c[5]的地址,同样代表c[0]地址),再将其解引用后强制转换为int*型赋给ptr2。

printf("%d,%d", *(ptr1 - 1),*(ptr2 - 1));

ptr1-1就表示下一个数组首元素aa[2][5]的前一个元素的地址,即本数组最后一个元素aa[2][4]的地址,解引用后就是10;ptr2表示c[5]的地址,也是c[0]的地址,减一表示指向前一个数组最后一个元素的地址,即b[4]的地址,解引用后就是5。
在这里插入图片描述

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

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

相关文章

repeating 路由_CSS中带有示例的repeating-linear-gradient()函数

repeating 路由Introduction: 介绍: So far, we have learned so many functions but learning never gets enough, therefore as a good developer, we must learn as many functions as we can and know their behavior with the help of practical implementati…

万字详解|手撕 9大排序算法!

0. 前言大家好,我是多选参数的程序锅,一个正在捣鼓操作系统、学数据结构和算法以及 Java 的失业人员。数据结构和算法我已经学了有一段日子了,最近也开始在刷 LeetCode 上面的题目了,但是自己感觉在算法上还是 0 ,还得…

.Net判断一个对象是否为数值类型探讨总结(高营养含量,含最终代码及跑分)...

前一篇发出来后引发了积极的探讨,起到了抛砖引玉效果,感谢大家参与。 吐槽一下:这个问题比其看起来要难得多得多啊。 大家的讨论最终还是没有一个完全正确的答案,不过我根据讨论结果总结了一个差不多算是最终版的代码,…

一个多月的时间,终于把这件事做完了!

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)关注我的小伙伴都知道,前段时间磊哥搞了一个免费的模拟面试,但因为工作和(面试&#xff…

漫画:什么是红黑树?(整合版)

前段时间,小灰发布了红黑树相关的文章,分成上下篇来讲解。这一次,小灰把两篇文章做了整合,并且修正了红黑树删除部分的图片错误,感谢大家的指正。————— 第二天 —————————————————二叉查找树&a…

PHP高并发高负载系统架构

2019独角兽企业重金招聘Python工程师标准>>> 一、高并发和高负载的约束条件 硬件部署操作系统Web 服务器PHPMySQL测试二、解决之道——硬件篇 处理能力的提升:部署多颗CPU,选择多核心、具备更高运算频率、更大高速缓存的CPU; 处理…

图解|查找数组中最大值的5种方法!

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)我们在一些特定场景下,例如查询公司员工的最高薪资,以及班级的最高成绩又或者是面试中都会遇到查找最…

JDK15正式发布,新增功能预览!

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)JDK 15 在 2020 年 9 月 15 号正式发布了,这次发布的主要功能有:JEP 339:EdDSA 数字签名…

[LeetCode] Longest Consecutive Sequence 求解

为什么80%的码农都做不了架构师?>>> 题目 Given an unsorted array of integers, find the length of the longest consecutive elements sequence. For example, Given [100, 4, 200, 1, 3, 2], The longest consecutive elements sequence is [1, 2, …

双向循环链表

双向循环链表是一种较为特殊的链表,也是一种常见的数据结构,其头尾相连,各节点之间可互相访问,在单链表中,只能依次向后访问,无法访问上一个节点,而双链表可以依次向下访问也可向上访问。 链表…

OkHttp透明压缩,收获性能10倍,外加故障一枚

要使用OkHttp,一定要知道它的透明压缩,否则死都不知道怎么死的;或者活也不知道为什么活的不舒坦。反正不是好事。什么叫透明压缩呢?OkHttp在发送请求的时候,会自动加入gzip请求头Accept-Encoding:gzip。所以&#xff0…

块元素、行内块和内联元素_如何删除内联块元素之间的空间?

块元素、行内块和内联元素Introduction: 介绍: This question has become rather popular. How does one remove whitespaces between the inline-block elements? The interesting thing is there are numerous solutions to this but not all of them are easy …

Spring--quartz中cronExpression 的配置方法

Spring--quartz中cronExpression Java代码 字段 允许值 允许的特殊字符 秒 0-59 , - * / 分 0-59 , - * / 小时 0-23 , - * / 日期 1-31 , - * ? / L W C 月份 1-12 或者 JAN-DEC , - * /…

C语言图形库——EasyX基本贴图

在C语言的学习过程中,接触最多的就是黑乎乎的DOS窗口,这也是在消磨学习者的兴趣,学到最后可能还不知道C语言到底能做什么,难道就是输入输出数据吗?当然不是,C的用处很广泛,这里不做讨论。我们能…

一气之下,手撸了一个抖音去水印的工具!

百因必有果说一下我为什么要做个抖音视频去水印工具,其实是因为我的沙雕女友,她居然刚我~有天晚上她在抖音看见一个非常具有 教育意义 的视频,“男人疼媳妇就该承包全部家务活”,然后它就想把视频下载下来,分享到她的姐…

css 隐藏元素 显示元素_使用CSS打印时如何隐藏元素?

css 隐藏元素 显示元素Introduction: 介绍: We have come across many challenges while developing a website or web page and every challenge comes with new learnings. It is a trait of a good developer who develops or creates websites or web pages by…

Java新特性:数据类型可以扔掉了?

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)在很久很久以前,我们写代码时要慎重的考虑变量的数据类型,比如下面这些:枚举&#xff1a…

Spyder:Python中机器学习的强大武器

So, first of all, you would need to install Anaconda distribution which can be downloaded from the link https://www.anaconda.com/download/ (for Windows users only). 因此,首先,您需要安装Anaconda发行版 ,可以从链接https://www.…

对内存重叠的深入认识

内存重叠:拷贝的目的地址在源地址范围内。所谓内存重叠就是拷贝的目的地址和源地址有重叠。在函数strcpy和函数memcpy都没有对内存重叠做处理的,使用这两个函数的时候只有程序员自己保证源地址和目标地址不重叠,或者使用memmove函数进行内存拷…

Android特效 五种Toast具体解释

Toast是Android中用来显示显示信息的一种机制,和Dialog不一样的是,Toast是没有焦点的,并且Toast显示的时间有限,过一定的时间就会自己主动消失。 1.默认效果: 代码:Toast.makeText(getApplicationContext(), "默认Toast样式&…