C语言 ——— 指针笔试题(中篇)

news2025/1/11 17:44:04

指针加减整数和解引用的笔试题 

笔试题1:

int a[5][5];
int(*p)[4];
p = a;

printf("%p  %d", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);

问:打印的结果为?(分别以 %d 和 %p 的形式打印)

解析:p = a; 

a是一个二维数组,a单独拿出来时是数组名,表示首元素的地址,而二维数组首元素的地址就是第一行元素的地址(也就是一个一维数组),那么这里a的类型是 int(*)[5] ,p是一个指针,这个指针的类型是 int(*)[4] ,把 a赋值给p ,那么把a赋值给p会发生截断,而p每次只能访问4个字节

解析:&p[4][2] - &a[4][2]

内存示意图:

p 每次加1只能访问4个字节,且同一空间的 指针 减去 指针 得到的是指针之间的元素个数,所以 &p[4][2] - &a[4][2] 以%d 的形式打印的结果是 -4 (因为是小地址 减去 大地址,且指针减指针没有绝对值的概念)

所以 &p[4][2] - &a[4][2] 以%d打印的结果是 -4

-4 存储在内存中补码的示意图:

以%p的形式打印,那么会把 -4的补码当作地址打印出来,这时就没有正负数之分了

-4 的补码以%p的形式打印示意图:

每4位二进制表示一位十六进制

所以 &p[4][2] - &a[4][2] 以%p的形式打印的结果是 FFFFFFFC 


笔试题2:

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\n", (ptr1 - 1), *(ptr2 - 1));

问:打印的结果为? 

代码解析:

aa是一个2行5列的二维数组,所以 { 1,2,3,4,5,6,7,8,9,10 } 等价于 { {1,2,3,4,5} , {6,7,8,9,10} }

解析:int* ptr1 = (int*)(&aa + 1); 

&数组名,取出的是整个数组的地址,加1后指向的是数组最后一个元素的下一个位置的地址,把地址强制类型转换为 int* 类型,再用 int* 类型的ptr1接收

解析:*(ptr1 - 1) 

ptr1 指向的是aa数组的最后一个元素的下一个位置,减1后指向了数组最后一个元素的首地址,再解引用,就拿到了数组的最后一个元素,且最后一个元素是10

所以 *(ptr1 - 1) 以%d的形式打印的结果是 10

解析:int* ptr2 = (int*)(*(aa + 1)); 

aa是数组首元素地址,而二维数组的首元素地址是第一行所以元素的地址,也就是一个一维数组,那么 aa + 1 后指向的是数组第二行的所以地址,强制类型转换为 int* 后赋值给 int* 类型的ptr2,那么此时ptr2指向的就是二维数组aa 的第二行的第一个元素的首地址,也就是元素为6的首地址

解析:*(ptr2 - 1) 

因为不论是一维数组还是二维数组,存储在内存中的数据都是连续的,所以 ptr2 - 1 就指向了数组的 上一个元素的首地址,也就是 5 这个元素的首地址,再解引用,拿到的就是5这个元素

所以 *(ptr2 - 1) 以%d的形式打印的结果是 5


笔试题3:

char* a[] = { "work", "at" , "alibaba" };

char** pa = a;

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

问:打印的结果为? 

代码解析:

a是一个字符指针数组,a的类型是char**,存储的并不是常量字符串,存储的是常量字符串的首元素地址,所以存储每个元素的类型是 char*

解析:char** pa = a; 

a是一个二级指针,要存储a的话,需要二级指针才能存储,所以存储到的是 char** 类型的 pa,此时的pa指向的也是 数组a 首元素的地址,也就是 字符 'w' 的首地址

解析:*(pa + 1) 

pa + 1 后就指向了 数组a中的第二个元素的首地址,再通过%s的形式打印 ,打印的就是第二个常量字符串

所以 *(pa + 1) 以%s的形式打印的结果是 "at" 

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

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

相关文章

十六、maven git-快速上手(智慧云教育平台)

🌻🌻 目录 一、概述及项目管理工具介绍1.1 项目介绍1.2 maven 介绍及其配置1.2.1 maven 介绍1.2.2 maven 下载与配置 1.3 pom 中常见标签的使用1.4 后端项目环境的搭建1.5 Git 简介1.6 Git 的基本使用1.6.1 码云的注册与仓库创建1.6.2 上传代码到码云仓库…

【2024】InfluxDB v2 介绍和安装使用(1)

目录💻 一、介绍1、时序数据库介绍特点:常见的时序数据库时序库受欢迎度排名 2、InfluxDB介绍**InfluxDB 1.x 和 2.0 的主要区别**InfluxDB行协议 二、docker安装 InfluxDB v2三. Web UI常用功能介绍以及使用1、页面介绍2、功能使用2.1、创建bucket2.2、…

如何设计一个测试用例

前言👀~ 上一章我们介绍了什么是软件测试以及软件测试的一些基础概念,今天来聊聊如何设计一个测试用例,涉及到黑盒测试的测试方法 基于需求进行测试用例的设计 基于需求的具体设计方法 等价类 边界值 判定表法 正交表法 场景设计法 …

智能ai对话软件都有哪些?分享4款!

在科技日新月异的今天,智能AI对话软件正以前所未有的速度改变着我们的生活方式与工作模式。它们不仅仅是冷冰冰的代码堆砌,更是拥有理解、学习乃至创造能力的智能伙伴,为人类社会带来了前所未有的便捷与乐趣。那么,究竟有哪些智能…

git安装和使用(托管服务 分支 克隆)超细教程

先来了解一下知识 下载与安装 (默认安装,下一步即可) 下载地址: https://git-scm.com/download 下载完成后可以得到如下安装文件: 双击下载的安装文件来安装Git。安装完成后在电脑桌面(也可以是其他目录)点击右键,如…

动态规划-斐波那契数列

一. 什么是动态规划 dp一般是需要前面状态的值的问题。比如,解决一个问题需要很多步骤,且步骤之间相关联,后一个步骤的推导需要前一个步骤的结论。而我们所做的就是,将这个带求解的问题分成若干步骤,将每个步骤答案保…

成为git砖家(10): 根据文件内容生成SHA-1

文章目录 1. .git/objects 目录2. git cat-file 命令3. 根据文件内容生成 sha-14. 结语5. References 1. .git/objects 目录 git 是一个根据文件内容进行检索的系统。 当创建 hello.py, 填入 print("hello, world")的内容, 并执行 git add hello.py gi…

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——1到手测试

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——1到手测试 ​ 大家好,今天给大家带来的是购买到小车或者说RDK X3之后直接快速体验,今天主要围绕官方的快速入门手册进行逐步测试 1.知识补充1 ​ 在这里首先要给新手小白补充几…

JVM结构、架构与生命周期总结

【1】JVM结构 不同厂商的JVM产品 : 厂商JVMOracle-SUNHotspotOracleJRocketIBMJ9 JVM阿里Taobao JVM HotSpot VM是目前市面上高性能虚拟机的代表作之一。它采用解释器与即时编译器并存的架构。 在今天,Java程序的运行性能早已脱胎换骨,已…

数据上新 | 景联文科技推出高质量方言音文对数据集,驱动方言语音大模型技术革新

中国电信人工智能研究院(TeleAI)正式对外发布星辰超多方言语音识别大模型。这是业内首个支持30种方言自由混说的语音识别大模型,也是目前国内支持最多方言的语音识别大模型。 方言语音大模型具有广泛的应用场景,可以应用于语音助手…

1.1.9创建应用

1.在全局配置文件下找到urls.py进行路由配置 配置路由要指明哪个应用,和写好模块导入的函数 2.找到路由要启动的应用,在应用里找到视图函数进行设计 path(‘url模式/“,视图函数) 注意第五部没有/ 1.1.110路由匹配模…

小阿轩yx-KVM+GFS 分布式存储系统构建 KVM 高可用

小阿轩yx-KVMGFS 分布式存储系统构建 KVM 高可用 案例分析 案例概述 使用 KVM 及 GlusterFS 技术,结合起来实现 KVM 高可用利用 GlusterFS 分布式复制卷对 KVM 虚拟机文件进行分布存储和冗余 分布式复制卷 主要用于需要冗余的情况下把一个文件存放在两个或两个…

刚起步的海外仓怎么选WMS系统,要注意什么

对于刚起步的海外仓企业来说,最紧要的事情就是把核心业务打磨平稳,形成核心竞争力,才能在激烈的竞争中赢得一席之地。 而要实现这个目的,WMS海外仓系统的引入当然是必要的一环,不过因为刚起步,业务和资源都…

AI产品经理的职责与能力:将AI技术转化为实际价值

一、AI产品经理的职责 发现和解决问题:AI产品经理需要具备敏锐的洞察力,能够发现用户需求和痛点,并提出相应的解决方案。传递价值给用户:AI产品经理需要确保产品能够满足用户的需求,提供价值,并提升用户体…

大模型之语言大模型技术

本文作为大模型综述第二篇,介绍语言大模型基本技术。 近年来,在 Transformer 架构基础上构建的预训练语言模型为自然语言处理领域带来了一系列突破式进展,成为人工智能主流技术范式。预训练语言模型采用“预训练+微调”方法,主要分为两步: 1)将模型在大规模无标注数据上…

No static resource favicon.ico.问题解决

一,问题 Spring Boot项目调用接口时报错 org.springframework.web.servlet.resource.NoResourceFoundException: No static resource favicon.ico. at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpReques…

餐饮卫生数字化防线:EasyCVR明厨亮灶/透明厨房/阳光厨房视频监管方案

近期有新闻报道,某互联网大厂办事处发生了一起大规模食物中毒事件,导致近60人住院。餐饮食品卫生安全直接关系到人民群众的身体健康和生命安全,是社会关注的焦点。 传统的监管方式往往依赖于人力巡查和抽检,存在效率低、覆盖面窄…

企业邮箱安全稳定吗?

企业邮箱安全稳定吗?企业邮箱通过GDPR等国际标准保护数据,采用加密技术、反垃圾邮件、身份验证等措施确保安全。服务器全球分布,灾难恢复和备份确保稳定。Zoho邮箱提供多种版本和注册流程,支持邮件协作、备份与恢复等功能。 一、…

成为一名月薪 2 万的 web 安全工程师需要掌握哪些技能?

现在 web 安全工程师比较火,岗位比较稀缺,现在除了一些大公司对学历要求严格,其余公司看中的大部分是能力。 有个亲戚的儿子已经工作 2 年了……当初也是因为其他的行业要求比较高,所以才选择的 web 安全方向。 资料免费分享给你…

“电商兴农 走进柳湖”明天赵堡准时启动,邀您一起来采摘

为了进一步推动农村电子商务普及应用,营造农村电商发展浓厚氛围,培育电商新业态、新模式,宣传推广崆峒农特产品,推动城乡生产与消费有效对接,拓宽农特产品销售渠道,释放农村消费潜能,挖掘乡村文…