数组名结合指针的面试题的讲解

news2024/11/15 10:51:04
笔试题
第一题:
已知条件:
已知p为结构体指针变量,值为0x100000,并且结构体的大小为20字节,并且打印格式均为%p,%p不会在乎正负数,它会以补码的形式直接打印,0x1为16进制的1。
第一问:p+0x1,
p为结构体指针,指针的+1-1,是一种指针的关系运算,跳过的大小取决于指针本身的类型,如果是整形指针,它+1跳过四个字节,所以p+1会跳过20个字节大小,所以0x100000需要加上20个字节大小,但不是0x100020,要先把20转化为16进制,得到14,所以应该是00100014
第二问:它将16进制的0x100000强转成了无符号long 型,也就是强转成了整形,所以如果200+1就等于201,500+1就等于501,所以结果为00100001
第三问:它将p强转成了整形指针类型,这个时候+1-1,就应该是按照整形指针的权限来就是+-,所以应该是+4,结果为:00000004
第二题:

第一问:int *ptr1 = (int *)(&a + 1),

&a代表拿出了整个数组的地址,然后+1,此时指针会跳过整个数组,现在的类型是int * [4],它将其强转为了int *,然后问ptr1 [-1]是多少,ptr1 [-1]就是*(ptr+(-1)),就等与*(ptr-1),此时指针应该往回走1个单位,它是int*,所以往回走四个字节,刚好指向了4,所以结果为4。

vs是小端存储,所以从左往右存储数组的时候,是如图所示的存储方式。

第二问如图所示:int *ptr2 = (int *)((int)a + 1), 

第一步:(int)a + 1,a为首元素地址,假设此时地址是0x0012ff40,现在被强转成了整数,然后对这个整数进行+1,结果就是0x0012ff41,然后又将这个整数强转成了int*的指针,此时的0x0012ff41就是一个新的地址了,它和原来的数组首地址0x0012ff40相比,它向后走了一个字节(如图ptr2所指向的位置),此时%x打印,应该向后访问四个字节的内容,由于是小端存储,所以数据应该是2000000

 第三题:

问题:这是一个二维数组,3行四列,但是由于不是{ { },{ },{ }},而是{()()()},这是一个逗号表达式,保留下来的结果应该是1,3,5。所以这个二维数组应该如图所示:

然后 p = a[0];p是int*,这一步就是将a[0],也就是第一行的首地址赋给了p,所以p现在时第一行数组的首元素地址,然后p[0],也就是*p,所以直接打印出了1。 

第四题:

如图所示:

第二问(%d)数组的存储是从低地址到高地址的,p指向的是一个4个整形的一维数组,p+1,p+2,p+3,p+4如图所示,每次跳过四个整形(16字节),所以p [4] [2]应该指向图中&p [4] [2]所对应的位置,此时和&a[4][2]进行相减,其结果的绝对值是中间相差的元素个数,因为以%d打印,所以应该是-4。

第一问(%p),是将-4以%p的形式打印,%p没有符号之分,直接将-4的补码以16进制进行打印

 如图所示:-4的原返补码,以及16进制

第五题:

首先第一步char**pa = a; a是一个字符串数组的地址,这个地址被存放进了pa,类型是char**

如图所示:

因为a是数组名,其代表首元素地址,也就是"work"的地址,然后pa++,它就跳过了首元素,指向了第二个元素,所以结果为  at

第六题:

第一问:*(ptr1 - 1)

首先:int *ptr1 = (int *)(&aa + 1);,这一步&aa取出了整个二维数组的地址,然后+1代表跳过了整个二维数组的地址,如图所示

图中的红色ptr1就是跳过了二维数组指向的地址。然后此时把这个东西强转成了int*,它的类型从int(*)[2][5],变成了int*,然后以%d的形式打印*(ptr1-1),就是将红色的ptr1往后跳了四个自己,因为此时的红色ptr1是int*,解引用往后跳过4个字节,也就是一个整形的位置,所以指向了10。

第二问:*(ptr2 - 1)

首先* ( aa + 1 )这一步,aa为数组名,现在代表数组首元素地址,也就是一维数组1,2,3,4,5的首地址,然后+1.此时指向了第二个一维数组6,7,8,9,10的首地址,此时aa+1的类型是int(*)[5],然后就是对一个数组指针进行了解引用,所以结果是一个一维数组,然后又因为一维数组名代表首元素地址,也就是第一个元素6的地址,类型为int*,所以此时题目的将int*强转成int*是没有意义的,然后 * ( ptr2 - 1 )这一步,让ptr2往回走1个单位,因为ptr2是int*,所以它往回走四个字节,也就是一个整形的地址,指向了5的地址,所以结果是5。

第七题: 

已知条件:

将3,4,5语句翻译如下图所示:

第一问 :printf("%s\n", **++cpp);

根据操作符得知从右往左读即可。

第一步:这是一个++cpp前置++,计算就是以++后的结果来计算的,cpp是一个三级指针,它存放的是二级指针数组的地址(cp的首地址),++让它由指向cp的首地址变成了指向cp中的第二个元素。

第二步:此时的一个*,对这个cpp指向的地址(也就是cp中的第二个元素的首地址)进行解引用,得到了cp中的第二个元素的内容c+2。

第三步:而c+2也是一个地址,它指向的是数组c中的第三个元素(如图),此时的最后一个*,对c+2这个地址进行解引用,得到了数组c中的第三个元素的内容,也就是字符串POINT的首地址,此时以%s形式打印,当然是得到POINT这个字符串啦。

第二问:printf("%s\n", *--*++cpp+3);
根据操作符的先后顺序,可知+3放在最后,其余的从右往左读即可。
\
第一步: ++ cpp,由于cpp在第一问的时候由于前置++指向了cp中的第二个元素,前置++的结果是在cpp上进行的,所以我们要保留第一问的操作,然后再进行前置++。此时cpp指向了cp中的第三个元素。
\
第二步:然后对cpp指向的数组cp中的第二个元素进行*的解引用 ,此时得到的是cp中的第三个元素的内容c+1。
\
第三步:对这个c+1进行前置--,即--(c+1),所以结果为c。
\
第四步:然后对c再次进行*,按照数组cp中元素c指向了数组c中的第一个元素,所以此时的结果是数组c中的第一个元素内容,也就是字符串ENTER的首地址。
\
第五步:此时最后一步+3,让这个地址让后移动3个单位,指向了ENTER中的第二个E的地址,再以%s的形式打印,也就是ER。
\
第三问:printf("%s\n", *cpp[-2]+3);
根据操作符的先后顺序,可知+3放在最后,其余的从右往左读即可。
\
第一步:cpp[-2],可以理解为*(cpp-2),由第二问可知cpp已经更新到了指向cp中的第三个元素的首地址,所以此时的cpp-2让指针往回走两个单位,指向了cp中的第一个元素的地址。此时cpp的移动不会影响到第四问cpp指向的元素,因为cpp-2的值没有赋给cpp,而++cpp这种是赋值了。
\
第二步:再进行*,得到了第一个元素的内容c+3,此时 * cpp [ - 2 ]的这一颗*,对c+3进行了解引用,得到了c+3所指向的数组c中的最后一个元素(FIRST的首地址),然后最后一步+3,与第二问类型,让指针指向了S的地址,再以%s打印,得到了ST。
\
第四问:printf("%s\n", cpp[-1][-1]+1);
根据操作符的先后顺序,可知+1放在最后,其余的从右往左读即可。
\
第一步: cpp [ - 1 ][ - 1 ]可以理解为 *(*(cpp-1)-1),由第三问可知,cpp还是指向了数组cp第三个元素的首地址,此时-1再*,得到的是c+2。
\
第二步:然后再对c+2进行-1再*,得到的是数组c中的第二个元素内容,也就是NEW的首地址,然后+1,与前面类似,指针指向了E的首地址,再以%s的形式打印,得到的是EW。

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

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

相关文章

[C++核心编程](九):类和对象——多态**

目录 多态的分类 多态的原理剖析 多态的优点 纯虚函数和抽象类 虚析构和纯虚析构 多态是C面向对象三大特性之一 多态的分类 静态多态 -函数重载和运算符重载属于静态多态,复用函数名 -函数地址早绑定-编译阶段确定函数地址 动态多态 -派生类和虚函数实现运行…

Docker达梦安装

拷贝安装包到 /soft目录下,执行以下命令导入安装包: docker load -i dm8_20230808_rev197096_x86_rh6_64_single.tar 结果显示如下: 启动容器 镜像导入后,使用 docker run 启动容器,启动命令如下: doc…

如何使用vue定义组件之——子组件调用父组件数据

1.定义父子模板template <div class"container"><my-father></my-father><my-father></my-father><my-father></my-father><!-- 此处无法调用子组件&#xff0c;子组件必须依赖于父组件进行展示 --><!-- <my-…

基于电鳗觅食优化算法(Electric eel foraging optimization,EEFO)的无人机三维路径规划(提供MATLAB代码)

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化飞行…

UE5 UMG拖拽旋转

需要一个区域接收ButtonDown再在ButtonUp取消作用再在ButtonMove改变值最后tick或者ButtonMove去做动作

Python小设计

1. 五个PPT上的界面打印【print、input函数】 &#xff08;1&#xff09;英雄商城登陆界面 print(英雄联盟商城登录界面 ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~1. 用户登录2. 新用户注册3. 退出系统 ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~…

Day30:安全开发-JS应用NodeJS指南原型链污染Express框架功能实现审计

目录 环境搭建-NodeJS-解析安装&库安装 功能实现-NodeJS-数据库&文件&执行 安全问题-NodeJS-注入&RCE&原型链 案例分析-NodeJS-CTF题目&源码审计 开发指南-NodeJS-安全SecGuide项目 思维导图 JS知识点&#xff1a; 功能&#xff1a;登录验证&…

EI期刊复现:面向配电网韧性提升的移动储能预布局与动态调度策略程序代码!

适用平台&#xff1a;MatlabYalmipCplex/Gurobi/Mosek 程序提出一种多源协同的两阶段配电网韧性提升策略。在灾前考虑光伏出力不确定性与网络重构&#xff0c;以移动储能配置成本与负荷削减风险成本最小为目标对储能的配置数量与位置进行预布局&#xff1b;在灾后通过多源协同…

保护IP地址安全:维护网络安全

在今天的数字化时代&#xff0c;IP地址是互联网通信的基础&#xff0c;也是网络安全的重要组成部分。保护IP地址安全至关重要&#xff0c;因为恶意攻击者可能利用IP地址进行网络入侵、数据泄露、服务拒绝等攻击。因此&#xff0c;制定有效的保护措施&#xff0c;维护IP地址的安…

深入理解指针——C语言

目录 1. 内存和地址 2. 指针变量和地址 3. 指针变量类型的意义 4. const修饰指针 5. 指针运算 6. 野指针 7. assert断言 8. 指针的使用和传址调用 9. 数组名的理解 10. 使用指针访问数组 11. 一维数组传参的本质 12. 冒泡排序 13. 二级指针 14. 指针数组 15. 指…

英语同传翻译,北京本地同声传译收费价格多少

同声传译是一项高度专业化的服务&#xff0c;广泛应用于国际会议、商务洽谈、法庭审判等场合。由于其对译员的语言能力、专业知识以及应变能力的极高要求&#xff0c;使得同声传译的收费价格也相对较高。那么&#xff0c;英语同传翻译北京本地同声传译的收费价格到底是多少呢&a…

深入探索C与C++的混合编程

实现混合编程的技术细节 混合使用C和C可能由多种原因驱动。一方面&#xff0c;现有的大量优秀C语言库为特定任务提供了高效的解决方案&#xff0c;将这些库直接应用于C项目中可以节省大量的开发时间和成本。另一方面&#xff0c;C的高级特性如类、模板和异常处理等&#xff0c;…

Aigtek功率信号源的特点有哪些

功率信号源是一种用于产生高功率信号的电子设备&#xff0c;主要应用于无线通讯、雷达测量、广播电视等领域中。功率信号源具有输出功率大、稳定可靠、频率范围宽等特点&#xff0c;使其成为现代电子技术中不可或缺的重要组成部分。 以下是功率信号源的主要特点&#xff1a; 高…

科研三维模型高精度三维扫描服务3d逆向测绘建模工业产品抄数设计

三维抄数技术在科研三维模型的应用已经日益广泛&#xff0c;其高精度、高效率的特点使得科研工作者能够更快速、更准确地获取和分析数据。这一技术的核心在于通过专业的三维扫描仪对实物进行高精度测量&#xff0c;再将这些数据转化为三维数字模型&#xff0c;为后续的研究提供…

react 综合题-旧版

一、组件基础 1. React 事件机制 javascript 复制代码<div onClick{this.handleClick.bind(this)}>点我</div> React并不是将click事件绑定到了div的真实DOM上&#xff0c;而是在document处监听了所有的事件&#xff0c;当事件发生并且冒泡到document处的时候&a…

springboot268码头船只货柜管理系统

码头船只出行和货柜管理系统的设计与实现 摘要 针对于码头船只货柜信息管理方面的不规范&#xff0c;容错率低&#xff0c;管理人员处理数据费工费时&#xff0c;采用新开发的码头船只货柜管理系统可以从根源上规范整个数据处理流程。 码头船只货柜管理系统能够实现货柜管理…

运行springboot项目提示:java: 错误: 不支持发行版本 18、java: 错误: 无效的源发行版:18

java: 错误: 不支持发行版本 18 解决方法&#xff1a;修改字节码版本&#xff0c;可以多试几次。 java: 错误: 无效的源发行版&#xff1a;18 解决方法&#xff1a; 出现这些错误原因&#xff1a; spring版本与jdk版本不对应 我的spring boot版本是3.2.2&#xff0c;对应的j…

AI-线性回归模型

线性回归应用场景 房价预测&#xff0c;通过分析房地产市场的历史数据&#xff0c;如房屋大小、位置、建造年份等因素&#xff0c;线性回归可以帮助预测未来房价的走势。 销售额预测&#xff0c;企业可以利用线性回归模型来预测产品的销售额&#xff0c;这通常涉及到产品价格、…

如何选择合适的IP代理,如何为网络爬虫设置代理

目录 前言 1. 代理类型的选择 2. 代理速度 3. 代理稳定性 4. 代理的匿名性 5. 代理的地理位置 总结 前言 在进行网络爬虫任务时&#xff0c;为了避免被目标网站封禁IP或限制访问频率&#xff0c;我们通常会使用代理来隐藏真实的IP地址。选择合适的IP代理对于爬虫的成功…

降维算法之主成分分析 (Principal Component Analysis, PCA)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 主成分分析&#xff08;PCA&#xff09;是一种统计方法&#xff0c;用于减少数据的维度&#xff0c;同时尽量保留原始数据中的方差。PCA在机器学…