数组和指针练习解析(6)

news2024/11/17 16:28:56

题目:

int main() 

    char *c[] = {"ENTER","NEW","POINT","FIRST"};

    char**cp[] = {c+3,c+2,c+1,c};

    char***cpp = cp;

    printf("%s\n", **++cpp);

    printf("%s\n", *--*++cpp+3);

    printf("%s\n", *cpp[-2]+3);

    printf("%s\n", cpp[-1][-1]+1);

    return 0; 

}

思路分析:

 

     char *c[] = {"ENTER","NEW","POINT","FIRST"};

  • 创建了一个字符指针数组,指针数组的内部存储的是各个字符串的首个字符的地址。

char**cp[] = {c+3,c+2,c+1,c};

  • cp是一个二级指针数组,数组的内部存储的是字符指针数组c的某些地址。
  • c+3——其中c是指针数组c的数组名,表示的是数组中首元素的地址,也便是c[0]的地址,而c+3表示的是往后加上三个元素的地址后抵达的位置,可以当作c[3]的地址。
  • c+2——同理,表示c[2]代表的元素地址
  • c+1——表示的是c[1]代表的元素地址
  • c——表示的是首元素地址

 

  char***cpp = cp;

cpp是三级指针,cpp内存储的是cp的首元素地址。


    printf("%s\n", **++cpp);

  1. ++使得cpp发生改变,原先的cpp内存储的是cp的首元素地址,在++后因为是指针数组,++表示的是向后加一个元素大小的地址,也就是第二个元素的地址。
  2. 因此在++后,这里的cpp存储的是cp1的第二个元素,c+2。
  3. 于是乎就变成了**(c+2),先解决第一个*,c+2在cp内,cp也是一个指针,所以c+2指向的是c中的第三个元素,POINT的首字符P的地址
  4. 于是乎就变成了*(P的首字符地址)
  5. 最后在解除最后一个*,且因为打印的格式是%s,所以打印除的结果是POINT

printf("%s\n", *--*++cpp+3);

  1. 按照优先级,先进行++cpp运算,因为++是有累计性的,所以cpp此刻存储的是cp中第二个元素的地址,如上图所示,因此在进行++后,cpp指向(存储)的地址变成了cp的第三个元素地址,也就是c+1的地址,所以变成了*--*(&cp[2])+3
  2. (&cp[2])表示的是cp中第三个元素的地址,最后通过*得到了内部存储的元素c+1,所以现在的结果是*--(c+1)+3
  3. *--(c+1)+3,在进行-- ,将c+1进行-- 得到的结果是c,于是变成了*(c)+3
  4. c指向的内容是字符串ENTER的首字符E的地址,所以在*后得到的是 'E'+3 
  5. 'E'+3 的E是字符类型,+3,相当于是加了三个字符类型的字节数大小,于是结果变成了ENTER中的第二个E
  6. 最后打印的格式是%s,所以打印的结果是ER

 

 printf("%s\n", *cpp[-2]+3);

  1. 由于++是有累积性的,所以cpp中存储的地址是cp的第三个元素的地址
  2. cpp[-2],表示的是一个元素,根据 *(数组名+ 0) =数组名[0] ,数组名[0]也表示一个元素 ,而数组名又表示首元素地址,我们得到结论,*(数组名+0)=数组名[0] =*( 首元素地址 +0)
  3. 而cpp是存储地址的指针,因此cpp[-2]我们可以得到,cpp现在所指向的地址-2之后得到的元素。
  4. cpp当前的地址是经过了上一次的++累加后,变成了如上图所示,指向的是cp的第三个元素,所以在-2后得到的结果是指向了cp的第一个元素,而第一个元素的内容是c+3
  5. 所以cpp[-2]= c+3
  6. *cpp[-2]+3 ————> *(c+3)+3
  7. c是一个数组名,表示的是数组首元素地址,而c+3根据数组名+n = &数组名[n]的原理,我们得到了c+3是表示首元素地址+3个元素的字节大小后后抵达的地址
  8. 在c中下标为3的元素是字符串FIRS的首字符地址,所以c+3表示的就是字符F的地址
  9. 随后得到 *(c+3)+3————>'F'+3
  10. 因为F是字符,且+3相当于是加上三个相同类型的字节数,又因为打印的各式是%s,所以得到的结果是ST

 

  printf("%s\n", cpp[-1][-1]+1);

  1. cpp内存储的依旧是cp中第三个元素的地址
  2. cpp[-1][-1]并不是二维数组所表达的意思,根据数组名[n] = *(数组名+n)的原理,进行计算,可以先将cpp[-1]当作数组名,那么我们可以转化为*(cpp[-1] +(-1))
  3. 而后,又将cpp当作数组名进行运算,那么我们可以转化为*(*(cpp+(-1))+(-1))——>*(*(cpp-1)-1)
  4. 而cpp中存储的是cp中第三个元素的地址,在进行-1后cpp中存储的地址发生了改变,变成了cp中第二个元素的地址,也就是c+2整个元素所在的地址,而通过第一个*后得到的结果就是c+2
  5. 所以式子变成了*(c+2-1)
  6. 内部运算,得到的结果是*(c+1)
  7. 最后整个式子是*(c+1)+1,而c是数组名,表示的是数组c的首元素地址,于是c+1表示的就是第二个元素的地址,在通过*得到的就是数组c的第二个元素
  8. 数组c的第二个元素是字符串NEW的首字符地址,所以最后的+1就是首字符地址加一,通过同类型原理,得到的就是第二个字符的地址
  9. 又因为打印的方式是%s所以最后的结果是EW

 

 

 结论:

  • *(数组名+ 0) =数组名[0],这里的数组名表示的是首元素地址
  • 数组名[n]表示的是在这个数组中,下标为n的元素的地址,也可以说为&数组名[n]
  • 数组名[n][n]这个数组并不是二维数组时,可以得到数组名[n][n]= *(*(数组名+n)+n)

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

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

相关文章

Unity3D Pico VR 手势识别

本文章使用的 Unity3D版本: 2021.3.6 , Pico SDK 230 ,Pico OS v.5.7.1 硬件Pico 4 Pico SDK可以去Pico官网下载SDK 导入SDK 第一步:创建Unity3D项目 第二步:导入 PICO Unity Integration SDK 选择 Windows > Package Manager。 在 Packag…

巴别塔再现?高质量端到端数据助力Meta推出AI模型SeamlessM4T

追求卓越与无限的精神一直流淌在人类的基因里。圣经中有故事:在古代,人们说着同一种语言,决定建造一座高耸入云,塔顶能触及天堂的塔,被称为巴别塔,以彰显人类的力量和创造力。然而上帝看到人类的意图&#…

数据科学 × 临床医学丨和鲸打造可供科研多角色协同的低代码研究平台

领域背景:临床研究的“多角色”性 临床研究是以疾病的诊断、治疗、预后和病因为主要研究内容,以患者为主要研究对象的科学研究活动。现代临床研究项目的开展具有“多角色”参与的特性,除了发起项目的 PI 外,项目的核心团队可能还…

14-模型 - 增删改查

增: # 1. 找到模型类并创建对象 user User() # 2. 给对象的属性赋值 user.username username user.password password user.phone phone # 3. 将user对象添加到session中 (类似缓存) db.session.add(user) # 4. 提交数据 db.session.commit() 删: # 两种删除:# 1. 逻辑删…

C++核心编程:类和对象

总览 C 面向对象的三大特性: 封装,继承,多态 C认为 万事万物都皆为对象,对象上有其属性和行为 封装 封装的意义 封装是C面向对象的三大特征之一 封装的意义: 将属性和行为作为一个整体,表现生活中的事…

芯科科技推出专为Amazon Sidewalk优化的全新片上系统和开发工具,加速Sidewalk网络采用

芯科科技为Sidewalk开发提供专家级支持 中国,北京 - 2023年8月22日 – 致力于以安全、智能无线连接技术,建立更互联世界的全球领导厂商Silicon Labs(亦称“芯科科技”,NASDAQ:SLAB)今日在其一年一度的第四…

安防监控平台EasyCVR视频汇聚平台增加首页告警类型的详细介绍

安防监控/视频集中存储/云存储EasyCVR视频汇聚平台,可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等…

kubernetes--技术文档--可视化管理界面dashboard安装部署

阿丹: 使用官方提供的可视化界面来完成。 Kubernetes Dashboard是Kubernetes集群的Web UI,用户可以通过Dashboard进行管理集群内所有资源对象,例如查看资源对象的运行情况,部署新的资源对象,伸缩Deployment中的Pod数量…

SAP 之如何定义功能范围Function Area

目录 目录 前言 一、注意点 二、使用步骤 1. Step by step 2. 其它功能 总结 前言 在SAP中,FA功能范围是一个组织单元,一般根据活动对产生的运营费用进行分类。例如生产、管理、销售、研发等,可以分配给成本中心Cctr、GL总账科目、Ord…

电压放大器的用途有哪些

电压放大器是一种常见的电子设备,用于将输入信号的电压放大到所需的输出电压水平。它在各种领域中都有广泛的应用。下面西安安泰电子将介绍电压放大器的主要用途。 音频放大:电压放大器在音频领域中扮演着重要角色。音频放大器是电压放大器的一种特殊形式…

支付事-乐刷支付母公司移卡发布2023年中期业绩报告

8月24日晚间,乐刷支付母公司移卡发布2023年中期业绩报告。 2023年上半年,移卡实现收入20.62亿元,同比增长25.6%;经调整EBITDA2.91亿元;同比增长317.4%。业绩表现优异主要来源于主营支付业务的大幅增长。 中期业绩报告…

MIA文献阅读 —— 深度学习在医学图像分析中的最新进展及临床应用【2022】

目录 0 摘要1 引言2 深度学习方法概述2.1 监督式学习2.2 无监督学习2.2.1 自编码器 (Autoencoders)2.2.2 生成对抗网络(GANs)2.2.3 自监督学习 2.3. 半监督学习2.4 提高性能的策略2.4.1 注意力机制2.4.2 领域知识2.4.3 估计的不确定性 3 深度学习应用3.1 分类3.1.1 监督分类3.1…

Camunda 7.x 系列【28】定时器启动事件

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 前言2. 概述3. 案例演示3.1 建模3.2 固定时间日期3.2 持续时间3.3 重复间隔1. 前言 Sta…

qml相关知识1

qml相关知识1 QtQuick.Controls 哪个版本支持TreeModel 和 TreeItemqt5.12开始,TreeItem 类被删除,无法使用delegate 什么时候可以用Qt5.15中没有 import QtQuick.Controls 1吗,哪个版本有control1qml如何两种版本的controls混用(…

2023中国算力大会 | 中科驭数加入DPU推进计划,探讨DPU如何激活算网融合新基建

8月18日,由工业和信息化部、宁夏回族自治区人民政府共同主办的2023中国算力大会在宁夏银川隆重召开。作为DPU算力基础设施领军企业,中科驭数产品运营部副总经理曹辉受邀在中国信通院承办的算网融合分论坛发表主题演讲《释放极致算力 DPU激活算网融合新基…

SMC状态机 讲解1 XX.sm文件详解

SMC状态机 讲解1.4 XX.sm文件 1、Task类2、FSM任务3、创建SMC.sm文件4、定义FSM状态5、定义转换 transition6、定义FSM转换动作7、定义FSM默认转换8、定义状态Entry/Exit 动作9、连接Task与Task FSM 1、Task类 SMC为对象(不是进程或应用程序,而是单个对象)生成有限…

IT运维:使用数据分析平台监控DELL服务器

概述 在企业日常运维中,我们有着大量的服务器设备,设备故障一般可以通过常用的监控软件实现自动告警,但如果在管理运维中我们要做的不仅仅是发现故障,处理硬件故障,我们还需要进一步的了解,今年一共出现了多…

【Linux应用部署篇】在CSDN云IDE平台部署Etherpad文档编辑器

【Linux应用部署篇】在CSDN云IDE平台部署Etherpad文档编辑器 一、CSDN云IDE平台介绍1.1 CSDN云IDE平台简介1.2 CSDN云IDE平台特点 二、本次实践介绍2.1 本次实践介绍2.2 Etherpad简介 三、登录CSDN云IDE平台3.1 登录CSDN开发云3.2 登录云IDE3.3 新建工作空间3.4 进入工作空间 四…

【测试流程】敏捷软件测试流程分享

一、背景 分享一套高效可靠的软件测试流程,目的是更好的保障产品质量,更高效的完成测试任务,提供给需要的朋友。 二、软件测试流程

Web端报错

Chunk-vendors.2a8c602b.js:48混合内容:位于‘https://3323.sfdy13168.com/#/goodsManage’的页面通过HTTPS加载,但请求了不安全的XMLHttpRequest端点‘http://110.42.2.202:8087/file/upload’.。此请求已被阻止;内容必须通过HTT…