操作多级(一、二、三级)指针才是我们的该有的姿态~

news2025/1/15 11:12:50

Hello,很有缘在这篇文章上我们相遇了,那么我就用题目巩固我们多级指针的知识,当然这里的题目是比较有点难度的,我们需要有点基础呀,如果你能轻松理解题目那说明你对指针的了解已经很有基础了呢,那废话不多说,开始进入正题了~

望喜欢


操作多级指针加减题

指针加减看似简单,但有些题目却很犀利,如下题,第一次看到它我的大脑也是很混乱呢,现在已经是已经了解通透了,现在就分享给你们了,这道题可以弄出很多知识点,需要认真剖析。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
	char* arr1[] = {"abcdefg","ABCDEF","qwertyu","QWERTY"};

	char** arr2[] = { arr1 + 3,arr1 + 2,arr1 + 1, arr1 };

	char*** arr3 = arr2;

	printf("%s\n",**arr3+1 );
	printf("%s\n",**arr2+1 );
	printf("%s\n",*--*++arr3+3 );
	printf("%s\n", **++arr3 + 2);

	printf("%s\n", arr3[-2][-1]+3);
	printf("%s\n", **arr3);
	return 0;
}

 我们先看一下答案吧

好,现在我们就仔细剖析,为什么计算机是这样打印的。

我们且看第一第二个打印结果的剖析:

printf("%s\n",**arr3+1 );
 printf("%s\n",**arr2+1 );

这里二级指针和三级指针为啥打印结果却一样,可能有人会想三级针针不应该在加一个“ * ”吗,那么我们就来解析一下

图中其实也解析了其实arr3里储存的是arr2[0]的地址,也就是你可以把arr3等价于arr2用,所以这里的第一行和第二行是一样的结果,且arr3用两个指针就能打印字符串,这里是我们先用两个“ * ”指向到字符串“QWERTY”,后面加1是最后执行的,然后指针指向字符串的第二位,所以打印结果如WERTY”。


 然后到第三行打印结果的解析:

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

图中我已经层层解析:

我们要知道++,- -和“ * ”的优先级是比较高的,所以这里我们

先++地址指向储存arr1+2的地址即arr2[1]的地址解引用后得到(arr1+2)再到减减(- -)变成(arr1+1),再然后解引用得到“ABCDEF”字符串,最后 +3,得到字符D的地址,打印后往后打印 “DEF”


再然后是第四行打印结果的解析 :

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

因为前面代对arr3加1过,现在arr3是指向存储arr+2的地址,这里再次++,使得arr3此时指向

arr1+1的存储地址即arr2 [2] 的地址,两次解引用后得到字符串”ABCDEF“的字符”A“的地址,再加2,得到字符”C“的地址,然后再次打印得到的结果就是”CDEF“


再然后到第五行的打印结果的解析:

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

这里需要先了解一个知识点 arr3[-2] 其实等价于 *(arr3-2) ,目前我们arr3指向的是arr2[2]的地址即储存arr1+1的地址,那么 -2 后解引用后得到arr1+3的存储地址即arr2 [0]处的地址,然后后面就是相当于*((arr1+3)-1),括号中运算完后得到*(arr1+2)解引用后得到字符串”qwertyu“的首地址,再加3得到字符 ”r“的地址,打印后就是得到”rtyu“。


现在到最后一行,很简单我们只需要知道现在arr3指向的是arr2中的哪一处的地址,可能很多人就想上面已经指向arr2[0]的地址,那么现在打印“QWERTY” ,如果这么想那就是错误的想法了。

printf("%s\n", **arr3);

这里上面的-2,只是解引用时-2指向arr2[0]的地址,但本身并未改变arr3,所以此时arr3指向的还是arr1+1的存储地址,所以两次解引用后便是”ABCDEF“了。


希望我的这篇文章让您可以理解通透指针的加减知识哦!

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

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

相关文章

Vue3自定义指令!!!

通过自定义指令实现菜单显示和权限控制问题。 一、新建一个在src目录下创建包directives&#xff0c;在包中创建一个ts文件。 import { useStore } from "/store/pinia";function hasRoles(role: any) {const pinaRoles useStore().roles;if (typeof role "s…

H5 流光分割个人主页源码

源码名称&#xff1a;流光分割个人主页源码 源码介绍&#xff1a;一款流光分割特效个人主页源码&#xff0c;源码带大量跳转个人联系方式按钮和朋友按钮。同时带有个人介绍。 需求环境&#xff1a;H5 下载地址&#xff1a; https://www.changyouzuhao.cn/10241.html

新品发布:广州大彩科技COF系列2.1寸480*480 IPS 串口屏发布!

一、产品介绍 该产品是一款2.1寸分辨率为 480480的医用级工业组态串口屏&#xff0c;拥有2.1寸IPS液晶屏&#xff0c;分辨率有480480&#xff08;实际显示为R240内切圆区域&#xff09;&#xff0c;支持电容触摸。采用COF超薄结构工艺设计&#xff0c;用户安装便捷灵活&#x…

REDHAWK——组件结构

文章目录 前言一、自动生成的组件文件1、为所有组件生成的文件2、为 C 组件生成的文件 二、自动生成的组件方法三、基础组件成员1、Ports2、Properties3、枚举①、C②、Java③、Python 4、Domain Awareness5、网络接口 四、组件实现五、管理和定义属性1、属性 ID2、属性名3、属…

C语言:字符串逆序输出, test ok

【问题描述】字符串逆序&#xff1a;设计函数功能是将一个字符串逆序&#xff0c;函数声明&#xff1a;void stringNx(char a[ ])&#xff0c;使用这个函数完成将输入的字符串逆序输出。 【输入形式】要求输入一个字符串 【输出形式】逆序后输出 【样例输入】abcd 【样例输…

Javaweb-MyBatis

一、概念 MyBatis是一款优秀的持久层框架&#xff0c;用于简化JDBC开发 MyBatis本是Apache的一个开源项目iBatis&#xff0c;2010年这个项目由apache software found迁移到了google code&#xff0c;并且改名为MyBatis。2013年11月迁移到Github 持久层 负责将数据到保存到数…

openGauss学习笔记-243 openGauss性能调优-SQL调优-典型SQL调优点-子查询调优

文章目录 openGauss学习笔记-243 openGauss性能调优-SQL调优-典型SQL调优点-子查询调优243.1 子查询调优243.1.1 子查询背景介绍243.1.2 openGauss对SubLink的优化243.1.3 更多优化示例 openGauss学习笔记-243 openGauss性能调优-SQL调优-典型SQL调优点-子查询调优 SQL调优是一…

【BOM笔记】基本概述、window对象常见事件、定时器、JS执行机制、location/navigator/history对象

文章目录 1 BOM概述1.1 什么是BOM1.2 BOM的构成 2 window 对象的常见事件2.1 窗口加载事件2.2 调整窗口大小事件 3 定时器3.1 setTimeout() 定时器3.2 setInterval() 定时器3.3 this 4 JS 执行机制4.1 JS 是单线程4.2 同步和异步4.3 JS 执行机制 5 location 对象5.1 属性5.2 方…

【深度学习笔记】9_9 语义分割和数据集

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 9.9 语义分割和数据集 在前几节讨论的目标检测问题中&#xff0c;我们一直使用方形边界框来标注和预测图像中的目标。本节将探讨语义分…

【欢迎投稿|稳定检索|高录用】2024年建筑土木与水利工程国际学术会议(ICBCHE 2024)

【欢迎投稿|稳定检索|高录用】2024年建筑土木与水利工程国际学术会议&#xff08;ICBCHE 2024) 苏老师 电话&#xff1a;19113133262&#xff08;微信同号&#xff09; QQ&#xff1a;2950880851 【投稿时请附言&#xff1a;icbche投稿苏老师推荐 将享有优先审稿及录用和学…

weblogic CVE-2023-21839详细复现

1、本次复现使用vulhub的靶场 切换到靶场的目录下&#xff0c;用docker -compose up -d启动靶场 使用docker-compose ps -a查看靶场的端口 2、访问开启的环境 3、准备工作都做好之后开始复现 &#xff08;1&#xff09;开启JNDIExploit 工具地址&#xff1a;GitHub - WhiteH…

HNU-计算机系统-实验1-原型机vspm1.0-(二周目玩家视角)

前言 二周目玩家&#xff0c;浅试一下这次的原型机实验。总体感觉跟上一年的很相似&#xff0c;但还是有所不同。 可以比较明显地感觉到&#xff0c;这个界面越来越好看了&#xff0c;可操作与可探索的功能也越来越多了。 我们HNU的SYSTEM真的越来越好了&#xff01;&#x…

使用C#创建服务端Web API

前言 C# Web API 是一种基于 .NET 平台&#xff08;包括但不限于.NET Framework 和 .NET Core&#xff09;构建 HTTP 服务的框架&#xff0c;用于创建 RESTful Web 服务。REST&#xff08;Representational State Transfer&#xff09;是一种软件架构风格&#xff0c;它利用HT…

Vue.js+SpringBoot开发APK检测管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 开放平台模块2.3 软件档案模块2.4 软件检测模块2.5 软件举报模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 开放平台表3.2.2 软件档案表3.2.3 软件检测表3.2.4 软件举报表 四、系统展示五、核心代…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Flex)

以弹性方式布局子组件的容器组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。Flex组件在渲染时存在二次布局过程&#xff0c;因此在对性能有严格要求的场景下建议使用Column、Row代替。Flex组…

【Spring】SpringMVC请求原理

什么是SpringMVC&#xff1a; SpringMVC 是Springframework中基于Java实现的Model-View-Controller框架&#xff0c;用于管理web应用程序的请求处理流程&#xff0c;并遵循MVC设计原则。 什么是MVC&#xff1a; MVC是Model-View-Controller的缩写&#xff0c;是一种设计原则&am…

PS学习 - 抠图-通道-主题颜色和背景颜色不能相近

抠出蝴蝶 1.通道抠图 套索工具 这里需要圈住你要的&#xff0c;注意尽量小点 ctrl j 复制 然后去掉背景 点击通道 找到明暗对比最大的通道&#xff0c;这里我理解为颜色反差最大的那个&#xff0c;突出你要抠的东西 搜了下说是一般为蓝色 复制通道 ctrll调出色阶 通过移…

MySQL--执行一条 select 语句,期间发生了什么?

执行一条 SQL 查询语句&#xff0c;期间发生了什么&#xff1f; 连接器&#xff1a;建立连接&#xff0c;管理连接、校验用户身份&#xff1b;查询缓存&#xff1a;查询语句如果命中查询缓存则直接返回&#xff0c;否则继续往下执行。MySQL 8.0 已删除该模块&#xff1b;解析 …

java-类和对象

1.面向对象 1.1 区分面向对象与面向过程 举个例子: 在传统的洗衣服过程中,需要经历防水,放衣服,放洗衣粉,搓洗,换水......多个步骤,每个过程都是不可或缺的,关注的是过程. 而现在的洗衣服过程,就需要我们把衣服,洗衣粉放入洗衣机,启动洗衣机即可,并不需要关注洗衣机是如何运行…

长期护理保险可改善老年人心理健康 | CHARLS CLHLS CFPS 公共数据库周报(3.6)...

欢迎报名2024年“真实世界临床研究”课程&#xff01; 本周郑老师开讲&#xff1a;“真实世界临床研究”培训班&#xff0c;3月16-17日两天&#xff0c;欢迎报名&#xff01; CHARLS公共数据库‍ CHARLS数据库简介中国健康与养老追踪调查(China Health and Retirement Longitud…