c++ 二维数组_【技术篇】C指针与二维数组深度辨析

一、源代码

/*第01行*/    

v2-cebeb1612d8d703445a663057d866a9d_b.jpg
CLion 2019.3.4 x64中编写的源代码·截图

二、深度辨析

v2-d2ae387790a8dd2aee1fe7d65e8e6262_b.jpg
CLion 2019.3.4 x64中编译的结果·截图

v2-04de867eb84843ac121a7717cc893731_b.png
zippo[4][2]是一个四行二列的int型二维数组

①不论一维数组还是二维数组,数组名就是指向数组首个元素的指针,也即数组名就是数组首个元素的地址。

二维数组 数组名zippo是数组zippo[2][4]首个元素zippo[0][0]的地址,数组名zippo是指向数组zippo[2][4]第一行(包含两个int型)的指针。

一维数组 数组名zippo[0]是数组zippo[2][4]首个元素zippo[0][0]的地址,数组名zippo[0]是指向数组zippo[2][4]第一行第一列(包含一个int型)的指针。

指针解释:zippo是指向zippo[0]的指针,zippo[0]是指向zippo[0][0]的指针,可以推导出三个表达式:*zippo=zippo[0],*zippo[0]=zippo[0][0],**zippo=zippo[0][0]。

取址解释:zippo[0][0]取地址就是zippo[0],zippo[0]取地址就是zippo,可以推导出两个表达式:&zippo[0][0]=zippo[0],&zippo[0]=zippo。

②给指针或地址进行数值增减1 ,其值会增减对应类型大小的数值。

——————————————————————————————————————

/*第04行*/ printf(" zippo=%p, zippo+1=%pn",zippo,zippo+1);

编译后的结果:zippo=0xffffcc00, zippo+1=0xffffcc08

解释:二维数组的数组名zippo(指针类型)是指向数组名为zippo[0](仍为指针类型)的一维数组的指针。数组名为zippo[0]的一维数组中每个元素占用两个int类型,即zippo[0]指向{2,4}(的首个元素的地址),zippo[1]指向{6,8}(的首个元素的地址),zippo[2]指向{1,3}(的首个元素的地址),zippo[3]指向{5,7}(的首个元素的地址)。

所以,当zippo=0xffffcc00时, zippo+1=0xffffcc00+sizeof(2*int)=0xffffcc08

——————————————————————————————————————/*第05行*/ printf(" zippo[0]=%p,zippo[0]+1=%pn",zippo[0],zippo[0]+1);

编译后的结果: zippo[0]=0xffffcc00,zippo[0]+1=0xffffcc04

解释:二维数组 数组名zippo是数组zippo[2][4]首个元素zippo[0][0]的地址,一维数组 数组名zippo[0]也是数组zippo[2][4]首个元素zippo[0][0]的地址,所以zippo[0]=zippo=0xffffcc00。zippo[0]指向{2,4},其所指向的对象虽然有两个元素,但每个元素都是int类型,所以当zippo[0]=0xffffcc00时, zippo[0]+1=0xffffcc00+sizeof(int)=0xffffcc04

——————————————————————————————————————/*第06行*/ printf(" *zippo=%p, *zippo+1=%pn",*zippo,*zippo+1);

编译后的结果:*zippo=0xffffcc00, *zippo+1=0xffffcc04

解释:*zippo=zippo[0]=0xffffcc00,*zippo+1=zippo[0]+1=0xffffcc00+sizeof(int)=0xffffcc04

——————————————————————————————————————/*第07行*/ printf(" zippo[0][0]=%dn",zippo[0][0]);

编译后的结果:zippo[0][0]=2

解释:zippo[0][0]表示数组zippo[4][2]中第一个元素(第一行第一列),为2

——————————————————————————————————————/*第08行*/ printf(" *zippo[0]=%dn",*zippo[0]);

编译后的结果:*zippo[0]=2

解释:zippo[0]指向{2,4},进一步解释为zippo[0]是指向数组{2,4}中首个元素2的指针,所以*zippo[0]为zippo[0]所指向的地址对应存储的内容,为2

——————————————————————————————————————/*第09行*/ printf(" **zippo=%dn",**zippo);

编译后的结果:**zippo=2

解释:zippo=0xffffcc00,zippo=zippo[0]=0xffffcc00,**zippo=*zippo[0]=2

—————————————————————————————————————/*第10行*/ printf(" zippo[2][1]=%dn",zippo[2][1]);

编译后的结果:zippo[2][1]=3

解释:zippo[2][1]表示数组zippo[4][2]中第六个元素(第三行第二列),为3

——————————————————————————————————————/*第11行*/ printf("*(*(zippo+2)+1)=%dn",*(*(zippo+2)+1));

编译后的结果:*(*(zippo+2)+1)=3

解释:zippo是指向zippo[0]的指针,所以zippo+2是指向zippo[2]的指针,进而

*(zippo+2)=zippo[2],zippo[2]是指向{1,3}中首个元素1的指针,所以zippo[2]+1是指向{1,3}中第二个元素3的指针,所以*(*(zippo+2)+1)=*(zippo[2]+1)=3

——————————————————————————————————————/*第12行*/ printf(" zippo=%pn" " &zippo[0]=%pn" " &zippo[0][0]=%pn",zippo,&zippo[0],&zippo[0][0]);

编译后的结果:

zippo=0xffffcc00

&zippo[0]=0xffffcc00

&zippo[0][0]=0xffffcc00

解释:zippo是指向数组zippo[4][2]首个元素zippo[0][0]的地址,即zippo是元素zippo[0][0](在数组中为2)的地址;zippo[0]是指向{2,4}首个元素的指针,&zippo[0]是{2,4}首个元素的地址,即&zippo[0]是数组中元素2(仍然对应为zippo[0][0])的地址。

所以,zippo=&zippo[0]=&zippo[0][0]=0xffffcc00

——————————————————————————————————————

v2-36bfa0d9feac517a918cfe0c349f77f2_b.jpg

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

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

相关文章

numberformate php_php number_format函数怎么用?

number_format函数是PHP中的一个内置函数,用于格式化一个包含数千个分组的数字,其语法是“string number_format ( $number, $decimals, $decimalpoint, $sep )”。本篇文章主要给大家介绍php number_format用法,希望对需要的朋友有所帮助&am…

android 脚本模拟点击屏幕,android 脚本模拟点击屏幕,android模拟

android 脚本模拟点击屏幕,android模拟对低概率问题,需要多次测试以复现问题,使用脚本更容易实现,避免频繁人工操作首先要了解手机的众多输入设备:命令:adb shell cat /proc/bus/input/devices/I: Bus0000 …

shiro启动之后页面访问不了_java:shiro入门——4

【7】测试【7.1】启动点击apply然后点击OK【7.2】登录过滤访问http://localhost:8080/platform/home的时候,会被【7.3】角色过滤使用“admin”用户登录,密码:123根据SecurityServiceImpl我们可以知道使用admin账号登录成功之后:此…

Android如何分析native代码,使用android-ndk-profiler对native代码进行性能分析

android-ndk-profiler需要使用gcc进行编译,从NDK r13b 起NDK使用的默认编译器从gcc换成了clang,官方提供了Simpleperf工具进行性能分析,具体情况可以参考https://developer.android.google.cn/ndk/guides/simpleperf 。下载使用编译方面的改动…

python模板语言_django的模板语言

Django模板语言1.基础语法:return render(request,qwe.html,{obj:obj}),render的最后的字典可以以键值对的形式传入多个值,在django模板中只用到两种符号变量相关:{{变量名}} 逻辑相关:{% %}1)变量相关:a: 变量名有字母数字和下划线组成,(.)用来获取对象的属性值,ls.0 --> …

oreo另一个意思_记一次有意思的统计(部分大宗商品价格指数相关性统计)

最近闲来无事,对部分大宗商品近十年的价格涨幅做了个统计,发现有些有意思的现象:大多资产价格走势如果放到一个足够长得时间维度里,那其实整体走势是比较一致的;有些资产价格走势高度相关,但是在某个时间段…

android左右耳机声音大小不一样,AirPods左右两边声音大小不同怎么办 单侧无声和两侧音量不同解决方法...

AirPods连接 iPhone 后如果出现了左右两边声音大小不一样,或者单侧无声的问题,可能是软件导致的暂时性故障,也有可能是硬件问题。当耳机音量出现异常时,可以通过以下几种方式尝试恢复。单侧无声和两侧音量不同解决方法&#xff1a…

laravel 任务队列_Laravel5.5之事件监听、任务调度、队列

流程:1.1 创建eventphp artisan make:event UserLoginLoginController.php/*** The user has been authenticated.** param IlluminateHttpRequest $request* param mixed $user* return mixed*/protected function authenticated(Request $request, $user){eve…

pytorch微调bert_小版BERT也能出奇迹:最火的预训练语言库探索小巧之路

选自Medium作者:Victor Sanh机器之心编译参与:魔王过去一段时间,大模型层出不穷。在大家纷纷感叹「大力出奇迹」的时候,作为调用预训练语言模型最流行的库,HuggingFace 尝试用更少的参数量、更少的训练资源实现同等的性…

android 应用无法安装程序,朋友android设备无法安装我的Android应用程序,我甚至不能为我自己做...

我最近上传了我的android应用程序到市场https://market.android.com/details?idcom.DGNT,但我的朋友们不能将它安装在他们的设备上(说他们的手机不兼容)。该网站甚至说我自己的手机与我的应用程序不兼容,即使我已经通过eclipse编译了它,并成…

qsub 指定节点_PBS,QSUB常用命令

1、后台提交作业qsub语法: qsub [-a date_time] [-A account_string] [-e path] [-h] [-I] [-jjoin] [-k keep] [-l resource_list] [-m mail_options] [-nNode_allocation_Method [-L v1,[v2,[v3,[v4]]]]] [-M user_list] [-Nname] [-o path] [-p priority] [-q pool] [-r y|n…

if test 多条件_秒懂Python编程中的if __name__ == #39;main#39; 作用和原理

在大多数编排得好一点的脚本或者程序里面都有这段if __name__ main:1 这段代码的功能一个python的文件有两种使用的方法:第一是直接作为脚本执行,第二是import到其他的python脚本中被调用(模块重用)执行。因此if __name__ main: 的作用就是控制这两种情…

android复杂列表滑动卡顿,Android 列表滑动性能优化总结

列表滑动性能优化是一个老生常谈的问题,最近在做项目的时候又遇到了列表滑动卡顿的问题,我在经过多次思考和尝试后,终于找到了滑动卡顿的元凶,于是将经验总结下来。ViewHolder先说说最常规的ViewHolder。ViewHolder的出现是为了解…

php淘客发单_如何使用PHP的curl函数调用维易淘客接口

《如何使用PHP的curl函数调用维易淘客接口》要点:使用curl调用维易淘客接口高佣转链维易淘客接口是用GET方式调用的,直接用GET调用即可,以下用PHP为例:使用curl调用维易淘客接口高佣转链:$apihttp://api.vephp.com/hca…

python背景颜色怎么随机_Python中的随机颜色

我同意TigerhawkT3(1)你教授对pick_color()的实现是垃圾。但我不认为random.choice(),或者你教授滥用random.shuffle()的方式是最好的选择。两者的问题是,在连续调用时可以获得相同的颜色,这是在正方形内绘制正方形时不…

python 解决手机拍的书籍图片发灰的问题

老师给发的作业经常是手机拍的,而不是扫描,背景发灰,如果二次打印就没有看了,象这样: 如果使用photoshop 处理,有些地方还是扣不干净,不如python 做的好,处理后如下: 具体…

2016年cypher资源_2021-2027年中国鱿鱼行业市场供需规模及未来前景分析报告

报告类型:产业研究报告格式:电子版、纸介版、电子纸介出品单位:智研咨询官网链接:中国产业信息网 - 产业前景投资趋势门户-智研旗下产业信息咨询平台​www.chyxx.com报告链接:2021-2027年中国鱿鱼行业市场供需规模及未…

地面控制点的定义与作用_什么是地面塌陷

地面塌陷2020年1月13日,青海西宁市城中区一公交车站附近地面突然塌陷,一辆搭载乘客的公交车掉入坑中,致使9人遇难。2019年12月12日,厦门吕厝路口地铁1号线和2号线外的配套物业开发项目施工现场发生约500平方米地面塌陷&#xff0c…

html填满剩余空间,html – 标题,两侧填充剩余空间

我被要求创建这个标题,纯粹用css,它甚至可能吗?文本的背景需要保持透明,h2需要跨越任何容器的宽度,并且左右边框自动填充剩余空间.h2 {font-size:42px;line-height:48px;width:100%;overflow: hidden;&:before {content:;position:relative;padding-left:50px;p…

python代码自动生成器下载_Python代码生成器

iefans下载为用户提供的Python代码生成器是一款高效实用的多功能代码自动编辑软件,该软件采用Delphi语言开发,同时内置了大量的编程学习内容与百款实例代码,让用户能够使用Python代码生成器快速插入判断、流程控制、算法等重复性很高的架构&a…