指针运算笔试题解析

题目一

#include <stdio.h>
 int main()
 {
 int a[5] = { 1, 2, 3, 4, 5 };
 int *ptr = (int *)(&a + 1);
 printf( "%d,%d", *(a + 1), *(ptr - 1));
 return 0;
 }
 //
程序的结果是什么?

答案中显示第一个是2,第二个是5

咱们先来解释一下第一个答案的原因,首先,a代表的是数组首元素的地址,a+1代表的是2的地址,2解引用就是2,所以答案是2

第二个当中,答案是5,首先,我们知道&a代表的是整个数组的地址,&a+1则是跳过了这个数组,然后转化为int*类型,存放到了ptr当中。

ptr-1代表着此时原本在数组末尾的地址向前移动了一步,此时代表的是5的地址,然后解引用,代表的就是5.

题目二

 //在X86环境下

//假设结构体的⼤⼩是20个字节

//程序输出的结构是啥?
#include<stdio.h>
struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p = (struct Test*)0x100000;
int main()
{
	printf("%p\n", p + 0x1);
	printf("%p\n", (unsigned long)p + 0x1);
	printf("%p\n", (unsigned int*)p + 0x1);
	return 0;
}

看到这个答案,大家知道原因吗?此时编译器为x86环境,这是因为最初的机器基本都是x86环境

首先,我们知道p是0x100000,而p+1跳过的是一个结构体大小,这个机构体是20个字节,所以可能有好多同学觉得答案是0x100020,但是这个是16进制啊,所以答案应该是00100014

第二个的答案是00100001,这个是因为首先p进行了类型的强制转换,从结构体类型转换成了整数类型,整数类型+1,那真的是+1,所以答案是00100001,

第三个答案是是00100004,有了上面的那个例子,这个例子是不是就很好理解,因为此时的p被强制类型转换成了指针类型,指针类型的大小是4/8,此时是x86环境下,所以指针的大小是4,所以答案是00100004

题目三

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

 

这个答案,大家有想到吗?,首先,a数组的这个部分大家看懂了吗

这个是你们认为的a数组,然后设立了一个整数指针p,将a的首行的地址存放到了p当中,然后将p的首元素打印出来,答案是1,这个时候你可能好奇了,答案应该是0呀,怎么会是1呢,别着急,听我慢慢和你说。

首先,a数组就不是上面表现的那样的,(0,1)这个是一个逗号表达式,输出结果是1

所以上面的第一个式子其实等价于下面的这个式子

int a[3][2] = { 1,3,5 };
 

这个搞懂的话,后面的顺其自然自然也懂了。

题目四

//假设环境是x86环境,程序输出的结果是啥?
 
#include <stdio.h>
 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;
 }

 

 首先,我们先来分析一下这道题,P是一个数组指针,指向的数组当中有4个整数类型的元素,a是一个五行五列的数组

然后将a的地址给了p,所以此时p是数组首元素的地址,而指针-指针的绝对值=二者之间相差的元素个数而p【0】,p【1】,还是p【4】只能包含4个元素,而a【0】,a【2】等能包含5个元,所以&p【4】【2】-&a【4】【2】的结果应该是-4,因为是小地址-大地址,所以用%d打印的时候,打印出来的结果就是-4,当用%p打印的时候,打印的应该是-4的补码(把补码当成了-4的地址,打印出来),结果就是FFFFFFFC

题目五

#include <stdio.h>
 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;
 }

 

有了上面的几道题的经验之后,这道题大家有想法吗?

这里面有两个关键点,首先第一个是&aa+1,这个是跳过了整个数组,此时ptr1指向了aa数组的末尾,第二个是aa+1,这个时候aa是数组名,代表的是数组首元素的地址,也就是aa数组第一行的地址,+1就是指向了第一行元素的末尾,第二行的开始,所以答案第一个是10,第二个是5

题目六

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

 

 在这道题当中,首先创建了一个数组a,a当中的每个元素都是char*类型的指针,下一步当中,把创建了一个指针pa,来存放a的地址,而a的类型是char*,而后pa++,此时pa,指向的是at的地址,然后将pa解引用,打印出来,结果就是at。

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

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

相关文章

【Linux】信号--信号的捕捉/可重入函数/volatile/SIGCHLD信号

文章目录 一、信号的捕捉1.用户态和内核态2.内核如何实现信号的捕捉3.sigaction 二、可重入函数三、volatile四、SIGCHLD信号 一、信号的捕捉 1.用户态和内核态 用户态的的时候&#xff0c;进行以下操作&#xff1a;1.操作系统自身的资源(getpid,waitpid…)2.硬件资源(printf…

YOLOv5改进 | 2023 | CARAFE提高精度的上采样方法(助力细节长点)

一、本文介绍 本文给大家带来的CARAFE&#xff08;Content-Aware ReAssembly of FEatures&#xff09;是一种用于增强卷积神经网络特征图的上采样方法。其主要旨在改进传统的上采样方法&#xff08;就是我们的Upsample&#xff09;的性能。CARAFE的核心思想是&#xff1a;使用…

低代码优缺点的那些事

什么是低代码 低代码是一种软件开发方法,旨在通过使用可视化工具和组件库来简化应用程序开发。低代码平台提供了一种快速开发应用程序的方式,无需编写大量的代码。开发人员可以使用拖放界面和预构建组件来构建应用程序,从而加快开发速度和降低开发成本。低代码平台通常也提…

【LeetCode刷题笔记】155.最小栈

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…

震惊,PDF文件转换已不再不是问题?

你是否曾经因为PDF文件的格式问题而感到困扰&#xff1f;是否曾经因为无法快速转换PDF文件而感到烦恼&#xff1f; 现在&#xff0c;这些问题都可以迎刃而解了&#xff01;下面这个在线PDF转换网站&#xff0c;就是你的解决方案。 目前5M以下文件免费转换&#xff0c;赶紧来看…

linux笔记--VSCode利用交换机跳转服务器

目录 1--前言 2--VSCode设置 3--ssh连接 1--前言 博主学校的服务器有两个&#xff0c;其中一个服务器&#xff08;14&#xff09;可以通过挂内网VPN来进行连接&#xff0c;但另一个服务器&#xff08;15&#xff09;即使挂了VPN也不能连接&#xff0c;只能通过内网进行连接。…

【机器学习】应用KNN实现鸢尾花种类预测

目录 前言 一、K最近邻&#xff08;KNN&#xff09;介绍 二、鸢尾花数据集介绍 三、鸢尾花数据集可视化 四、鸢尾花数据分析 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Fil…

MySQL 系列:注意 ORDER 和 LIMIT 联合使用的陷阱

文章目录 前言背后的原因ORDER BY 排序列存在相同值时返回顺序是不固定的LIMIT 和 ORDER BY 联合使用时的行为ORDER BY 或 GROUP BY 和 LIMIT 联合使用优化器默认使用有序索引 如何解决其它说明个人简介 前言 不知道大家在在分页查询中有没有遇到过这个问题&#xff0c;分页查…

三、JS逆向

一、JS逆向 解释&#xff1a;在我们爬虫的过程中经常会遇到参数被加密的情况&#xff0c;这样只有先在前端搞清楚加密参数是怎么生成的才能继续我们的爬虫&#xff0c;而且此时我们还需要用python去执行这个加密的过程。本文主要讲怎么在浏览器调试JS&#xff0c;以及Python执…

【数据结构和算法】--队列的特殊结构-循环队列

目录 循环队列的结构循环队列的实现循环队列的创建循环队列为空判断循环队列为满判断入队出队返回循环队列首元素返回循环队列尾元素释放循环队列 循环队列的结构 循环队列是队列的一种特殊结构&#xff0c;它的长度是固定的k&#xff0c;同样是先进先出&#xff0c;理论结构是…

PHP是世界上最好的语言-PolarDN XXF无参数RCE QUERY_STRING 特性

这个靶场我之前看到过打广告&#xff0c;而且感觉比较新 来坐坐 <?php //flag in $flag highlight_file(__FILE__); include("flag.php"); $c$_POST[sys]; $key1 0; $key2 0; if(isset($_GET[flag1]) || isset($_GET[flag2]) || isset($_POST[flag1]) || isset…

作者推荐 |【深入了解系统性能优化】「实战技术专题」全方面带你透彻探索服务优化技术方案(方案分析篇)

全方面带你透彻探索服务优化技术方案 前提背景影响一个系统性能的方方面面代码优化数据库优化网络优化硬件优化 常用的性能评价/测试指标响应时间并发数吞吐量响应时间、并发数和吞吐量之间的关系运作流程关系 性能优化方案的建议避免过早优化进行系统性能测试寻找系统瓶颈&…

Vue2将在2023年12月31日结束支持

文章目录 一、前言二、2023.12.31 会发生什么&#xff1f;三、接下来呢&#xff1f;四、仍然使用 Vue 2&#xff1f;你应该这样做4.1、升级到 Vue 2 的最终版本4.2、购买 Vue 2 的扩展支持4.3、通知用户 Vue 2 EOL 后的计划 五、展望未来六、最后 一、前言 随着 2024 年的临近…

【漏洞复现】捷诚管理信息系统 SQL注入漏洞

漏洞描述 捷诚管理信息系统是一款功能全面,可以支持自营、联营到外柜租赁的管理,其自身带工作流管理工具,能够帮助企业有效的开展内部审批工作。 该系统CWSFinanceCommon.asmx接口存在SQL注入漏洞。未经身份认证的攻击者可以通过该漏洞获取数据库敏感信息,深入利用可获取…

【5G PHY】5G小区类型、小区组和小区节点的概念介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

谷歌浏览器标签页显示内存使用率

Chrome 桌面浏览器的新更新现在可让您查看每个标签页占用了多少内存&#xff0c;这可以帮助您确定哪些标签页占用了多少内存&#xff0c;网站正在减慢您笔记本电脑的速度。 今年早些时候在 Google Chrome 中引入内存节省程序之后&#xff0c;Google 又发布了一项功能&#xff…

【LeetCode刷题-树】--173.二叉搜索树迭代器

173.二叉搜索树迭代器 本题就是实现二叉树的中序遍历&#xff0c;利用数组本身实现迭代器 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.va…

栈和队列的实现(Java篇)

文章目录 一、栈的概念二、栈的实现2.1压栈(push)2.2出栈(pop)2.3获取栈顶元素(peek)2.4判断栈是否为空(isEmpty)栈的实现测试 三、队列的概念四、队列的实现4.1入队(offer)4.2出队(poll)4.3判断队列是否为空4.4获取对头元素队列的实现测试 五、循环队列5.1入队5.2出队5.3获取队…

基于Java SSM框架实现智能停车场系统项目【项目源码+论文说明】

基于java的SSM框架实现智能停车场系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个智能停车场管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述…

TVS管连接方式与电压的选取

TVS管连接方式与电压的选取 电源供电电压为12V时&#xff0c;TVS管可以选用15V&#xff1b;电源供电电压为24V&#xff0c;TVS管可以选用24V。 TVS管的供电接口的连接方式。我们看到有些厂家的步进电机机驱动器或者其他驱动或做有防浪涌电路时&#xff0c;会有一个超级大的直插…
最新文章