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

题目:

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

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

相关文章

直播平台源码搭建协议讲解篇:传输控制协议TCP

简介: 由于直播平台在当今时代发展的越来越迅速,使得直播平台的技术功能越来越智能,让用户在直播平台中能够和其他用户进行实时互动,让用户可以获取到全世界最新的资讯,让一些用户可以作为主播获得工作,让…

SpringBoot案例-配置文件-参数配置化

前言 目前我们已经完成了部门管理和员工管理功能接口的实现,阿里云OSS工具类中,我们会设置4个参数,分别是云服务域名、云服务ID和密码、文件存储的Bucket、就会存在以下问题:参数配置分散以及参数发生变化,就需要对应…

测试框架pytest教程(3)夹具-@pytest.fixture

内置fixture Fixture使用pytest.fixture装饰,pytest有一些内置的fixture 命令可以查看内置fixture pytest --fixtures fixture范围 在pytest中,夹具(fixtures)具有不同的作用范围(scope),用于…

【计算机网络】【常考问题总结】

1. ping 127.0.0.1 后会发生什么? ping 127.0.0.1 ;ping 0.0.0.0 ; ping localhost 面试官问:断网了,还能ping通 127.0.0.1 吗?为什么?_kevin_tech的博客-CSDN博客 2. MTU,MMU是…

Vue教程(五):样式绑定——class和style

1、样式代码准备 样式提前准备 <style>.basic{width: 400px;height: 100px;border: 1px solid black;}.happy{border: 4px solid red;background-color: rgba(255, 255, 0, 0.644);background: linear-gradient(30deg, yellow, pink, orange, yellow);}.sad{border: 4px …

ffmpeg windows环境MinGW+msys2编译so库

一、安装MinGW 1.1、下载MinGW 1.2、下载完成后&#xff0c;会得到一个名为 mingw-get-setup.exe 的安装包&#xff0c;双击打开它&#xff0c;可以看到如下的对话框&#xff1a; 1.3、直接点击“Install”&#xff0c;进入下面的对话框 1.4、可根据自己操作系统的实际情况&am…

利用“病毒制造机”实现脚本病毒的制造

一、脚本病毒的概念&#xff1a; 脚本病毒通常是 JavaScript 或 VBScript 等语言编写的恶意代码&#xff0c;一般广告性质&#xff0c;会修改 IE 首页、修改注册表等信息&#xff0c;对用户计算机造成破坏。 通过网页进行的传播的病毒较为典型&#xff0c;脚本病毒还会有如下前…

【快速傅里叶变换(fft)和逆快速傅里叶变换】生成雷达接收到的经过多普勒频移的脉冲雷达信号(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Python支持下最新Noah-MP陆面模式站点、区域模拟及可视化分析技术

查看原文>>> Python支持下最新Noah-MP陆面模式站点、区域模拟及可视化分析技术 熟悉陆表过程的主要研究内容以及陆面模型在生态水文研究中的地位和作用&#xff1b;深入理解Noah-MP 5.0模型的原理&#xff0c;掌握Noah-MP模型&#xff08;2023年最新发布的5.0版本&am…

[JavaWeb]【十二】web后端开发-事务管理AOP

目录 一、事务管理 1.1 事务回顾 1.2 Spring事务管理 1.2.1 案例 1.2.1.1 EmpMapper新增deleteByDeptId方法 1.2.1.2 DeptServiceImpl 1.2.1.3 启动服务-测试 1.2.2 模拟异常 1.2.3 分析问题 1.2.4 Spring事务管理&#xff08;一般用在类似多次delete&#xff09; 1.2.4…

现学现用,人脸识别让会议签到更轻松!

会议签到作为组织和管理任何规模的会议、研讨会或活动的重要环节&#xff0c;在确保参会人员准确到场的同时&#xff0c;也直接影响了会议的整体效率和顺利进行。 传统的纸质签到方式存在着繁琐、时间消耗较多等问题&#xff0c;而随着科技的不断发展&#xff0c;智能化会议签到…

Qt --- QTimer

在Qt开发界面的时候&#xff0c;非常多的时候都得使用定时器&#xff0c;定时器具体可以干什么呢&#xff1f;比如&#xff1a;控制时钟、定时改变样式、改变进度等。。。说到这里&#xff0c;经常使用QQ&#xff0c;而不同的时段都会显示不同的背景&#xff0c;我认为如果用Qt…

人工智能如何颠覆和改变信息安全格局

当谈及网络信息安全领域&#xff0c;人工智能&#xff08;AI&#xff09;正扮演着关键的角色。其作用是分析庞大的风险数据&#xff0c;以及企业信息系统中不同威胁之间的关联&#xff0c;从而识别出全新类型的攻击方式。这一过程的成果为各类网络安全团队提供了重要情报&#…

PostgreSQL-研究学习-介绍与安装

PostgreSQL-预研 是个很厉害的数据库的样子 ψ(*&#xff40;ー)ψ 官方文档&#xff1a;http://www.postgres.cn/docs/12/ 总的结论和备注 PgSQL 支持对JSON的支持很强大&#xff0c;以及提供了很多数学几何相关的数据类型【例&#xff1a;点&#xff0c;线条&#xff0c;几何…

FastJson在Java后端方面解析使用(二)

​ JSON现在常用来做前后端数据交互&#xff0c;两个蝴蝶飞只是简单的对JSON做一下讲解和简单使用。关于JSON,我还了解的远远不够。由于本人经验有限&#xff0c;嘴皮子不溜&#xff0c;所以学术性&#xff0c;概念性&#xff0c;底层性的知识点暂时不做介绍。文章中有错误之处…

爬虫逆向实战(二十)--某99网站登录

一、数据接口分析 主页地址&#xff1a;某99网站 1、抓包 通过抓包可以发现登录接口是AC_userlogin 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”可以发现txtPassword和aws是加密参数 请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 无…

SSL/TLS协议的概念、工作原理、作用以及注意事项

个人主页&#xff1a;insist--个人主页​​​​​​ 本文专栏&#xff1a;网络基础——带你走进网络世界 本专栏会持续更新网络基础知识&#xff0c;希望大家多多支持&#xff0c;让我们一起探索这个神奇而广阔的网络世界。 目录 一、SSL/TLS协议的基本概念 二、SSL/TLS的工作…

抖音短视频seo矩阵系统源代码技术开发方案分享

一、 功能结构设计 1. 视频管理&#xff1a;对于不同平台&#xff0c;不同账号&#xff0c;不同格式&#xff0c;不同内容短视频进行管理&#xff0c;素材分组等&#xff0c;实现多资源数据汇和统一管理 2. 数据挖掘分析&#xff1a;通过数据挖掘和数据分析&#xff0c;提供数…

Apache Hudi初探(二)(与flink的结合)--flink写hudi的操作(JobManager端的提交操作)

背景 在Apache Hudi初探(一)(与flink的结合)中&#xff0c;我们提到了Pipelines.hoodieStreamWrite 写hudi文件,这个操作真正写hudi是在Pipelines.hoodieStreamWrite方法下的transform(opName("stream_write", conf), TypeInformation.of(Object.class), operatorFa…

NVIDIA vGPU License许可服务器高可用全套部署秘籍

第1章 前言 近期遇到比较多的场景使用vGPU&#xff0c;比如Citrix 3D场景、Horizon 3D场景&#xff0c;还有AI等&#xff0c;都需要使用显卡设计研发等&#xff0c;此时许可服务器尤为重要&#xff0c;许可断掉会出现掉帧等情况&#xff0c;我们此次教大家部署HA许可服务器。 …