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

笔试题
第一题:
已知条件:
已知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.hqwc.cn/news/538685.html

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

相关文章

基于springboot实现驾校信息管理系统项目【项目源码+论文说明】

基于springboot实现驾校信息管理系统演示 摘要 随着人们生活水平的不断提高,出行方式多样化,也以私家车为主,那么既然私家车的需求不断增长,那么基于驾校的考核管理也就不断增强,那么业务系统也就慢慢的随之加大。信息…

微信小程序-day01

文章目录 前言微信小程序介绍 一、为什么要学习微信小程序?二、微信小程序的历史创建开发环境1.注册账号2.获取APPID 三、下载微信开发者工具1.创建微信小程序项目2.填写相关信息3.项目创建成功 四、小程序目录结构项目的主体组成结构 总结 前言 微信小程序介绍 微信小程序&…

电源常用电路—驱动电路详解

数字电源控制核心对输入输出参数进行采集后,利用控制算法进行分析从而产生PWM控制信号,PWM信号将经过驱动电路的进行功率放大和隔离,随后接入功率开关器件从而完成电源的输出控制。本篇将主要针对电源的驱动电路进行讲解。 一、驱动电路概述…

【刷题】Leetcode 415 字符串相加 和 34 字符串相乘

刷题 Leetcode 415 字符串相加题目描述 思路一(模拟大法版!!!)Leetcode 34 字符串相乘题目描述 思路一(模拟大法版)Thanks♪(・ω・)ノ谢谢阅读!&…

解决驱动开发中<stdlib.h> no such file 的问题

前言 在进行驱动开发时&#xff0c;需要使用malloc等函数&#xff0c;导入C库<stdlib.h>出现bug。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本专栏&#xff0c;喜欢的可以关注本博主并订阅本专栏&#xff0c;一起讨论…

新 树莓派4B 温湿度监测 基于debian12的树莓派OS

前言 本文旨在完成通过外接温湿度传感器至树莓派使得树莓派不断记录并存储温湿度数据 这个领域有很多文章&#xff0c;但是部分文章已经缺乏了时效性&#xff0c;在最新系统不适用&#xff0c;本文目前适用 硬件 硬件连接 温湿度传感器常选用DHT11和DHT22&#xff0c;淘宝…

双手沾泥,大模型应用并不神秘

【引子】感谢图灵出版社英子老师赠书——《大模型应用开发极简入门》&#xff0c;读过之后&#xff0c;正好和自己的大模型系列文章相互印证&#xff0c;于是将读后感汇成此文。 如今&#xff0c;大模型应用已经渗透到各个领域&#xff0c;从自然语言处理到计算机视觉&#xff…

Flutter 核心原理 - UI 框架(UI Framework)

Flutter 既能保证很高的开发效率&#xff0c;又能获得很好的性能。 这两年 Flutter 技术热度持续提高&#xff0c;整个 Flutter 生态和社区也发生了翻天覆地的变化。目前Flutter 稳定版发布到了3.0&#xff0c;现在已经支持移动端、Web端和PC端&#xff0c;通过Flutter 开发的…

ssm蛋糕甜品商城系统(程序+文档+数据库)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

离线数仓(六)【ODS 层开发】

前言 今天开始正式的数仓搭建&#xff0c;所谓 ODS 层的工作就是把我们各种数据源采集发送来的各种类型的数据&#xff08;Json、tsv类型&#xff09;映射到 Hive 表中&#xff0c;映射时可以进行一些简单的处理&#xff0c;比如简单的数据清洗&#xff0c;舍弃一些没有必要的字…

设置浏览器显示小于12px以下字体

问题 我们在项目开发过程中有时候会遇到设计师给的小于12px的字体&#xff0c;IE、火狐浏览器、移动端等小于12px的字号大小还是可以正常显示的&#xff0c;但是谷歌浏览器上显示字体最小为12px&#xff0c;css设置font-size&#xff1a;10px&#xff0c;运行代码显示结果仍然…

Python环境搭建 -- Python与PyCharm安装

一、Python安装 我们先找到Python的官方网站&#xff0c;在浏览器中搜索Python即可&#xff0c;然后进入Python官网 点击Downloads&#xff0c;选择对应匹配的操作系统 点进去之后&#xff0c;Python的版本分为稳定的版本和前置版本&#xff0c;前置的版本就是还没有发行的版本…