指针进阶(三)

指针进阶(三)

指针习题组:

01:

int main()
{
    int a[5] = { 1, 2, 3, 4, 5 };
    int *ptr = (int *)(&a + 1);
    printf( "%d,%d", *(a + 1), *(ptr - 1));
    return 0;
}

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ecSWtNwr-1690364128380)(C:\Users\30539\AppData\Roaming\Typora\typora-user-images\image-20230720233855042.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uH8bof1S-1690364128382)(C:\Users\30539\AppData\Roaming\Typora\typora-user-images\image-20230721095622604.png)]

原因:这里a是数组名,存放的是数组的首地址,&a是整个数组的地址,+1操作跳过了整个数组,所以ptr的指向如图所示,ptr被强制类型转换之前的类型是:int(*)[5];是数组指针,现在被强制转化成了 int*类型,所以进行加减操作时,跳过的是整型的大小了,解引用操作也是向后访问一个整型的大小。第5行中的a是数组首元素的地址,也就是int*类型的地址,+1操作会跳过一个整型。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SfEuwrsX-1690364128382)(C:\Users\30539\AppData\Roaming\Typora\typora-user-images\image-20230721100332417.png)]

指向如图所示,再解引用操作,最终的得到了2和5.

02:

这里告知结构体的大小是20个字节
struct Test
{
    int Num;
    char *pcName;
    short sDate;
    char cha[2];
    short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
    printf("%p\n", p + 0x1);//0x100014
    printf("%p\n", (unsigned long)p + 0x1);//0x100001
    printf("%p\n", (unsigned int*)p + 0x1);//0x100004
    return 0;
}

原因:p是结构体指针变量,由于结构体的大小是20个字节,所以对p进行加减操作时,会跳过20个字节。代码第14行,就会加上20,转化成16进制就是加上14。当p被转化成 unsigned long类型时,进行加减操作时会发生代数上的简单的加减,所以代码第15行只是单纯的加上1。当p被转化为 unsigned in*类型时,进行加减操作时跳过4个字节,所以代码第16行的运行结果就是0x100004。

03:

int main()
{
    int a[4] = { 1, 2, 3, 4 };
    int *ptr1 = (int *)(&a + 1);
    int *ptr2 = (int *)((int)a + 1);
    printf( "%x,%x", ptr1[-1], *ptr2);//4 33554432
    return 0;
}

此时的ptr1和ptr2都是int*类型的变量,访问时会访问一个整型的大小。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8104apkp-1690364128382)(C:\Users\30539\AppData\Roaming\Typora\typora-user-images\image-20230721102659899.png)]

04:

#include <stdio.h>
int main()
{
    int a[3][2] = { (0, 1), (2, 3), (4, 5) };
    int *p;
    p = a[0];
    printf( "%d", p[0]);
    return 0;
}

运行结果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QiWDqPLf-1690364128383)(C:\Users\30539\AppData\Roaming\Typora\typora-user-images\image-20230721103713960.png)]

原因:注意初始化数组时,括号里的是逗号表达式,所以数组中存储的是:135000 ,p指针变量等同于第一个一维数组的数组名,p[0]等同于a[0][0],结果为1.

05:

int main()
{
    int a[5][5];
    int(*p)[4];
    p = a;
    printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
    return 0;
}

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u4JD15dV-1690364128383)(C:\Users\30539\AppData\Roaming\Typora\typora-user-images\image-20230721104519133.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9T5AEftG-1690364128383)(C:\Users\30539\AppData\Roaming\Typora\typora-user-images\image-20230726162041816.png)]

原因分析:由于p的类型是; int(*)[4];所以p在进行加减操作时,跳过的是4个元素,而a的类型是 int(*)[5];所以a进行加减操作时,跳过的是5个元素,由图可知,p[4][2]和a[4][2]之间相差了4个元素,由于p处于低地址,所以得到的答案是-4,又因为地址就是内存中实际存储的补码,所以-4以%p打印出来时,-4将会被看作无符号数进行打印,因为在内存中地址是没有正负之分的。所以打印结果就是 FFFFFFFFFFFFFFFC

06:

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));
    return 0;
}

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AVvnTQyR-1690364128384)(C:\Users\30539\AppData\Roaming\Typora\typora-user-images\image-20230721104441043.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-awvzqggi-1690364128384)(C:\Users\30539\AppData\Roaming\Typora\typora-user-images\image-20230726162835603.png)]

原因分析:ptr1和ptr2的指向如图所示,但由于他们都是int*类型的指针,所以进行加减操作时,会跳过一个整型,打印结果就是5和10了。

07:

#include <stdio.h>
int main()
{
    char *a[] = {"work","at","alibaba"};
    char**pa = a;
    pa++;
    printf("%s\n", *pa);
    return 0;
}

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4fekL26H-1690364128384)(C:\Users\30539\AppData\Roaming\Typora\typora-user-images\image-20230721104401489.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nBkq5E3I-1690364128384)(C:\Users\30539\AppData\Roaming\Typora\typora-user-images\image-20230726164400744.png)]

原因分析:pa的指向如图所示,pa中存储的是数组首元素的地址,这里的a数组中存放的三个字符串的首字符的地址,所以每个元素都是char*类型的。pa的类型是char**类型的,所以pa在进行加减操作时会跳过一个char*类型。pa++之后就指向的数组中的第二个元素,*pa就是第二个字符串首元素的地址。所以打印出了 at。

08:

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;
}

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nteqlXRh-1690364128385)(C:\Users\30539\AppData\Roaming\Typora\typora-user-images\image-20230721104314675.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HVF4NsQ4-1690364128385)(C:\Users\30539\AppData\Roaming\Typora\typora-user-images\image-20230726171403853.png)]

原因分析:

  • 在printf语句之前,数据关系如图所示。++cpp之后,cpp就指向cp中的c+2了,**++cpp就拿到了 POINT 这个字符串的首字符的地址,打印出POINT。
  • 接着,cpp再次进行++操作,此时cpp则指向了cp中的c+1了,*++cpp的类型是char**类型,进行–操作时,会向后跳过一个char*类型的数据,指向ENTER这个字符串,在进行解引用操作,此时类型就成了char*类型,再进行+3操作,就跳过了三个字符,此时则指向了ENTER这个字符串中的第三个字符,结果打印出ER。
  • cpp[-2]又指向的cp中的c+3了。*cpp[2]的类型是char*类型,再进行+3操作会跳过三个字符,此时就指向了FIRST这个字符串中的第三个字符,打印出ST。
  • cpp[-1]指向的是cp中的c+2, cpp[-1][-1]的类型为char* 类型,指向的是c中的NEW这个字符串,+1操作,指向NEW中的第二个字符,打印出EW。

这道题特别要注意的点是,cpp在前两次的++过程中,相应的cpp的指向是会被改变的,但是后面cpp[-1]这种操作,并不会改变cpp的指向。

完结

本章的内容就到这里啦,若有不足,欢迎评论区指正,下期见!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux:centos7:zabbix4.0(安装,监控》Linux》Windows》网络设备)

环境 centos7&#xff08;zabbix服务器&#xff09;内网ip&#xff1a;192.168.254.11 外网ip&#xff1a;192.168.0.188&#xff08;去网络yum源下载&#xff09; centos7&#xff08;被监控端&#xff09;内网ip&#xff1a;192.168.254.33win10&#xff08;被监控端&…

【后端面经】微服务构架 (1-3) | 熔断:抖抖抖不停?微服务熔断策略让你的系统稳如泰山!

文章目录 一、前置知识1、什么是熔断?2、什么是限流?3、什么是降级?4、怎么判断微服务出现了问题?A、指标有哪些?B、阈值如何选择?C、超过阈值之后,要不要持续一段时间才触发熔断?5、服务恢复正常二、面试环节1、面试准备2、面试基本思路三、总结 在微服务构架中…

Java版本工程项目管理系统源码-全面的工程项目管理

​ ​工程项目管理系统是指从事工程项目管理的企业&#xff08;以下简称工程项目管理企业&#xff09;受业主委托&#xff0c;按照合同约定&#xff0c;代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 如今建筑行业竞争激烈&#xff0c;内卷严重&#xff0c;…

ADCS知识点全收录! 如何利用证书服务器对域控进行多角度攻击(上)

在2021年的BlackHat大会上&#xff0c;由Will Schroeder和Lee Christensen发布了关于Active Directory Certificate Services 利用白皮书《Certified Pre-Owned - Abusing Active Directory Certificate Services》&#xff0c;其中包含了大量的针对ADCS的攻击手法&#xff0c;…

JavaFx实现自定义窗口

效果 代码 package cn.juhe.zjsb.task;import javafx.application.Application; import javafx.geometry.Insets; import javafx.geometry.Rectangle2D; import javafx.scene.Cursor; import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.scene.image…

【Nodejs】文件上传

1.初始化准备 1.1 安装依赖 首先创建一个express-multer-upload工程项目&#xff0c;然后在项目中下好各种依赖包。 multer中间件 Multer 是一个 node.js 中间件&#xff0c;用于处理 multipart/form-data 类型的表单数据&#xff0c;它主要用于上传文件。 注意: Multer 不会…

【Ajax】笔记-JQuery发送请求与通用方法

Get请求 语法格式&#xff1a; $.get(url, [data], [callback], [type]) url:请求的 URL 地址。data:请求携带的参数。callback:载入成功时回调函数。type:设置返回内容格式&#xff0c;xml, html, script, json, text, _default。 准备三个按钮分别测试Get 、Post、通用型方…

概率论的学习和整理21:用EXCEL来做假设检验(未完成草稿)

目录 1 EXCEL可以用来做假设检验 1.1 如何打开 数据分析 和 规划求解 1.2 EXCEL里关于正态分布的准备知识 2 基本的假设检验 2.1 最基本的假设检验&#xff0c;单边的Z检验 2.1 双样本F检验 2.1.1 例题 2.1.2 进行F检验之前需要满足一些假设条件 2.1.3 计算步骤 2.1…

Langchain 新手完全指南

原文&#xff1a;Langchain 新手完全指南 Langchain 可能是目前在 AI 领域中最热门的事物之一&#xff0c;仅次于向量数据库。 它是一个框架&#xff0c;用于在大型语言模型上开发应用程序&#xff0c;例如 GPT、LLama、Hugging Face 模型等。 它最初是一个 Python 包&#x…

实战攻防Demo|如何轻松形成自动响应的安全闭环?

从威胁阻断角度来说&#xff0c;拦住黑客的第一步攻击尤为重要。同样&#xff0c;对于攻击者来说&#xff0c;第一步攻击的成本也往往是最高的。日常工作中人们会遇到很多类型的攻击&#xff0c;但暴力破解或者撞库攻击往往被作为黑客的第一步攻击。这主要源于其技术含量低&…

【网络教程】如何快速的解决WordPress“另一更新正在进行”的问题

文章目录 WordPress提示“另一更新正在进行”解决方案手动删除数据库记录使用插件WordPress提示“另一更新正在进行” 当我们在更新WordPress的插件或者升级WordPress时会出现后台提示“另一更新正在进行”,如下图 当我们点击更新后,出现下图提示 出现上述问题是由于在升级Wo…

平板用的触控笔什么牌子好?ipad第三方电容笔推荐

随着技术的发展&#xff0c;出现了各种各样的平板电容笔。一支好的电容笔&#xff0c;不但可以极大地提升我们的工作效率&#xff0c;还可以极大地提升我们的学习效果。平替的电容笔&#xff0c;无论是在技术方面&#xff0c;还是在质量方面&#xff0c;都还有很大的提升空间&a…

在家下载论文使用哪些论文下载工具比较好

在家下载论文如果不借助论文下载工具是非常艰难的事情&#xff0c;因为很多查找下载论文的数据库都是需要账号权限才可使用的。 例如&#xff0c;我们查找中文论文常用的知网、万方等数据库以及众多国外论文数据库。 在家下载知网、万方数据库论文可用下面的方法&#xff1a;…

Apache pulsar 技术系列-- 消息重推的几种方式

导语 Apache Pulsar 是一个多租户、高性能的服务间消息传输解决方案&#xff0c;支持多租户、低延时、读写分离、跨地域复制&#xff08;GEO replication&#xff09;、快速扩容、灵活容错等特性。在很多场景下&#xff0c;用户需要通过 MQ 实现消息的重新推送能力&#xff0c…

RTI无线电层析成像Matlab仿真数据生成

文章目录 概述初始化环境参数 概述 无线电层析成像是一种通过获取一定区域内多对相对固定的无线通信节点间的某种测量数据后,按照一定的数学处理方法,对区域内的障碍物目标以图像的形式 展现出来的成像技术。 开山之作&#xff1a; J. Wilson and N. Patwari, “Radio tomogra…

教师ChatGPT的23种用法

火爆全网的ChatGPT&#xff0c;作为教师应该如何正确使用&#xff1f;本文梳理了教师ChatGPT的23种用法&#xff0c;一起来看看吧&#xff01; 1、回答问题 ChatGPT可用于实时回答问题&#xff0c;使其成为需要快速获取信息的学生的有用工具。 从这个意义上说&#xff0c;Cha…

天气越热越不能开空调,这是什么道理?

如今正值盛夏&#xff0c;炎热的太阳仿佛要把人烤化。相信很多小伙伴一回到家都会迫不及待地打开空调&#xff0c;在干爽的凉风中完成“自我复活”。然而需要警惕的是&#xff0c;相对密闭的空调房其实早已“暗藏杀机”&#xff0c;VOC、细菌、灰尘等室内“健康杀手”在房间里不…

Latex | 将MATLAB图并导入Latex中的方法

一、问题描述 用Latex时写paper时&#xff0c;要导入MATLAB生成的图进去 二、解决思路 &#xff08;1&#xff09;在MATLAB生成图片的窗口中&#xff0c;导出.eps矢量图 &#xff08;2&#xff09;把图上传到overleaf的目录 &#xff08;3&#xff09;在文中添加相应代码 三…

[ 容器 ] consul 容器服务更新与发现

目录 什么是服务注册与发现什么是consulconsul 部署consul 服务器 registrator服务器consul-templateconsul 多节点 什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承…

ftp和sftp区别,以及xftp的使用

网上找链接找的很辛苦对吧&#xff01; 网上下载的破解版还不用。而且用没多久又说要更新了&#xff0c;又得重新找。 这下直接把官方免费获取链接发给你&#xff0c;就不用在被这种事情麻烦了。 家庭/学校免费 - NetSarang Website (xshell.com):家庭/学校免费 - NetSarang W…