【C进阶】指针笔试题汇总

news2024/11/24 20:14:00

家人们欢迎来到小姜的世界,<<点此>>传送门 这里有详细的关于C/C++/Linux等的解析课程,家人们赶紧冲鸭!!!

指针笔试题

  • 前言
  • 一、题1
    • (一)题目
    • (二)答案及解析
    • (三)代码
  • 二、题2
    • (一)题目
    • (二)答案及解析
    • (三)代码
  • 三、题3
    • (一)题目
    • (二)答案及解析
    • (三)代码
  • 四、题4
    • (一)题目
    • (二)答案及解析
    • (三)代码
  • 五、题5
    • (一)题目
    • (二)答案及解析
    • (三)代码
  • 六、题6
    • (一)题目
    • (二)答案及解析
    • (三)代码
  • 七、题7
    • (一)题目
    • (二)答案及解析
    • (三)代码
  • 八、题8
    • (一)题目
    • (二)答案及解析
    • (三)代码
  • 总结


前言

指针的笔试题有许多,这都是C语言基础时候的笔试题,下面有8道笔试的题目,是很精炼的几道笔试题,主要分为三个模块,题目,答案及解析和代码,这里放上代码是为了供大家去进行复制粘贴到编译器里面试一试,在完成这些题目的时候需要细心与耐心,慢慢来,结合前面的知识图谱进行解读,这需要的是前面很好的指针基础以及了解前面的知识,但大家放心,我会仔仔细细,慢慢讲解这些题目,让大家完全了解和掌握。


一、题1

(一)题目

在这里插入图片描述

(二)答案及解析

答案:2,5
解析:大家看图,&a拿到的是整个数组的地址,也就是拿到蓝色方框的地址,&a的类型是int(*)[5],是个数组指针,+1这个操作是跳过整个数组跳到下一个数组,而这串数组是存放在cpu里面的,前后都不知道存放的是什么,只有a这个数组是被维护的。题目中的ptr又要是个(int*)的指针类型,那就需要将&a的类型进行强制类型转换成int*,所以题目问的是*(ptr-1),那不就是这个a数组的末尾元素吗,那就是5了,至于*(a+1)那就更简单了,a为首元素的地址,+1就是第二个元素的地址,一解引用那就直接为2。

在这里插入图片描述

(三)代码

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

(一)题目

在这里插入图片描述

(二)答案及解析

答案:0x00100014 0x00100001 0x00100004(0x表示十六进制)
解析:此题考察的就是指针+1,大家看图,我们规定p的值就是0x100000。
第一个printf是指针+1,跳过的是一整个结构体的大小,因为上面定义了*p就是用Text结构体定义的,那就是struct Text *p;所以+1跳过了一整个结构体,这个结构体的大小是20个字节,那我们跳过20个字节,在十六进制中是“14”,而我们是在32位机器下运行的,那这个类型是4个字节,前面补0,所以第一个答案是0x00100014。
第二个printf是将结构体指针p转化为无符号整型的p,整型+1的结果就是在原本的值的基础上+1,所以就是0x00100001。
第三个printf是将结构体指针p转换成为无符号整型指针,既然是指针,跳过的就是整型指针类型,那就是跳过4个字节,答案就是0x00100004。
在这里插入图片描述

ps:%p打印的是地址,32位机器上是占4个字节的,也就是0x00 00 00 00八位。

(三)代码

//假设这个Text结构体的大小是20个字节
struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p;
//假设p 的值为0x100000
int main()
{
	p = (struct Test*)0x100000;
	printf("%p\n", p + 0x1);
	printf("%p\n", (unsigned long)p + 0x1);
	printf("%p\n", (unsigned int*)p + 0x1);
	return 0;
}

三、题3

(一)题目

在这里插入图片描述

(二)答案及解析

答案:0x4 0x2000000(0x表示十六进制)
解析:大家看图。我们先分析ptr1指针,&a是取出的一整个数组的地址,而+1以后是跳过这一整个数组往后找下一个数组,那后面打印的是ptr[-1]相当于ptr1-1,ptr1-1是往后一个整型指针类型的大小,那么指向的就是4,那么答案就是4。
再分析一下ptr2,这时候我们需要展开所有字节来看了,这就是指针的魅力所在,我们发现a应该是首元素的地址,但解引用成(int),所以a就是一个简单的整型,不是指针,所以单纯的+1就是单纯的跳过一个字节,因为4+1=5(跳过的是1个字节),指针4+1=8(跳过的是4个字节),那所以(int)a+1指向的就是00这个字节,而当(int)a+1整个强制类型转换成为(int*),整型指针占4个字节,那就是从(int)a+1这个指向的字节位置往后找4个字节即可,那就是00 00 00 02,而我们题目给定的条件是小端存放,且在x86的情况下,那么我们进行拿出来显示的时候是02000000,所以%p结果就是0x02000000,而这道题目要求的是%x,也就是十六进制,则前导的0要删掉。
在这里插入图片描述

ps:%x表示的是十六进制,前导的0都需要删掉。

(三)代码

//小端,X86环境
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);
	return 0;
}

四、题4

(一)题目

在这里插入图片描述

(二)答案及解析

答案:1
解析:这道题目是在是太贼了,这花括号里面不是花括号,而是逗号,我思考了半天这道题,死来想去应该是0,而答案却是1,原来是有个(,),逗号表达式返回的是后面的值,所以值为1,3,5,0,0,0。我们知道二维数组的值那就好办了,a[0]就是二维数组的首行数组名,那也就是p这个指针指向的是a这个二维数组首行的地址,也就是两个元素,而p[0]又是*(p+0)==*p,那也就是1了。

在这里插入图片描述
在这里插入图片描述

(三)代码

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

五、题5

(一)题目

在这里插入图片描述

(二)答案及解析

答案:0xFFFFFFFC -4
解析:这道题目坑是真的多呀,我们先看二维数组a的类型,是int(*)[5]是一组中有五个元素的,而p的类型是int(*)[4],是一组中有4个元素的,这两个类型都不匹配,还不强制类型转换,直接即将a赋给p了,这让p太为难了,p说没事儿,我接收你,那好,p现在是将a的内存空间进行划分,四个元素四个元素划分一个,所以我们要求的p[4][2]就是褐色那片区域,而指针指向的是褐色所在的那片区域的最左边,而我们要求的a[4][2]就是绿色区域了,根据指针相减,发现是低地址减高地址,那就是-4了,可是此题没完,前面要的是%p,那是个地址,我们知道在计算机内存中数字是以二进制的补码存储的,那这就很简单了,地址又不看补码的,直接换算成地址,那就是0xFFFFFFFC了。
在这里插入图片描述

(三)代码

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

六、题6

(一)题目

在这里插入图片描述

(二)答案及解析

答案:10 5

解析:如下图所示,我们先知道的是&aa取的是整个数组的地址,那+1是跳过整个二维数组,那就是指向10的末尾,那-1是指向的是10,再解引用就拿出来的结果为10,而aa是首个数组的地址,+1是跳过首个数组到第二个数组的头,但此时也是取的是第二个数组,但是进行强制类型转换了,所以ptr2指针-1是跳过一个元素,所以显示的是5。

在这里插入图片描述

(三)代码

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

七、题7

(一)题目

在这里插入图片描述

(二)答案及解析

答案:at
解析:我们先看字符指针数组char* a[],这个指针指向的是后面三个字符串的首元素,而char** pa=a,所以pa指向的是字符指针a的首元素,这个关系我们清楚了以后,看一看pa++的含义,我们此时想了,char** pa的含义是:char* *pa,这个意思是对pa进行加一的操作,是跳过的一个char*元素,所以指向的是’a’,进行解引用打印字符串打印的就是at。
在这里插入图片描述

(三)代码

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

八、题8

(一)题目

在这里插入图片描述

(二)答案及解析

答案:POINT ER ST EW
解析:总的分析:
在这里插入图片描述
分开单独分析:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(三)代码

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

总结

终于归纳完这些练习题了,这些练习题实在是太坑了,那么多的坑等着你去踩,但是我们需要一步步去了解一下它们,它们也不是那么难以理解与制作,那就需要有学习的方法,利用画图或者是反推是非常重要的,所以对于我们来说,我们需要把这些题目当成朋友去看待,相信总能解决的,感谢大家耐心阅读!!!


客官,码字不易,来个三连支持一下吧!!!

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

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

相关文章

【Python】函数——模块与函数的导入

概述 为了方便使用函数&#xff0c;我们可以将函数存储在称为模块的独立文件中&#xff0c;再将模块导入到主程序中&#xff0c;导入一个模块需要使用import语句。 导入整个模块 模块是扩展名为.py的文件 1、导入某个模块 语法为&#xff1a; import module_name 2、导入…

[oeasy]python0043_八进制_oct_octal_october_octave

八进制(oct) 回忆上次内容 什么是 转义&#xff1f; 转义转义 转化含义\ 是 转义字符\n、\r是 转义序列 还有什么 转义序列 吗&#xff1f; \a是 响铃\b 退格键\t 水平制表符 tab键\v、\f 实现喂纸不回车 通过 16进制数值 转义 \xhh输出 (hh)16进制对应的ascii字符 如果我们不…

Portainer使用docker compose搭建nacos并初始化MySQL、Portainer stack搭建nacos并初始化MySQL

Portainer使用docker compose搭建nacos初始化MySQL、Portainer stack搭建nacos初始化MySQL新建stack(堆栈)添加stack(堆栈)名称添加docker-compose规则配置环境变量上传初始化sql文件找初始化sql文件nacos初始化mysql-schema.sql文件内容上传sql文件到初始化挂载目录部署stack(…

打印机不打印故障简单排除方法

日常工作中经常会遇到打印机不能打印的情况&#xff0c;那么又没有专业的技术人员在场帮忙的情况下我们也可以自己动手简单的处理一下故障&#xff0c;可以尝试以下的方法进行简单的故障排除&#xff1b; 一、使打印机处于联机状态&#xff0c;如果打印机没有处于联机状态&…

医疗影像工具LEADTOOLS 入门教程: 检测和提取 MICR - 控制台 C#

LEADTOOLS是一个综合工具包的集合&#xff0c;用于将识别、文档、医疗、成像和多媒体技术整合到桌面、服务器、平板电脑、网络和移动解决方案中&#xff0c;是一项企业级文档自动化解决方案&#xff0c;有捕捉&#xff0c;OCR&#xff0c;OMR&#xff0c;表单识别和处理&#x…

基于STM32或STC的手势控制MP3语音播放器的设计

一. 系统设计框图 区别于传统设计中的按键开关控制&#xff0c;本设计可以实现通过手势控制MP3播放器。采用STM32或STC15单片机和PAJ7620手势模块&#xff0c;能够识别九种手势&#xff0c;分别为上下左右前后&#xff0c;顺时针&#xff0c;逆时针&#xff0c;挥动。在本设计…

SpringBoot视图解析与模板引擎

目录 1、视图解析 1、视图解析原理流程 2、模板引擎-Thymeleaf 1、thymeleaf简介 2、基本语法 3、设置属性值-th:attr 4、迭代 5、条件运算 6、属性优先级 3、thymeleaf使用 1、引入Starter 2、自动配置好了thymeleaf 3、页面开发 4、构建后台管理系统 1、项目…

Java基础03——数组

Java基础03——数组一、数组介绍二、数组的定义与静态初始化1. 定义数组2. 数组静态初始化三、数组元素访问1. 数组的地址值2. 数组访问四、数组遍历五、数组动态初始化六、数组常见问题1. 索引越界异常七、数组常见操作1. 求最值2. 求和3. 交换数据4. 打乱数据八、数组内存图九…

java企业人事管理系统企业工资考勤系统

简介 Java基于ssm开发的企业人事考勤工资系统&#xff0c;员工可以打卡、请假。系统根据员工的打卡情况自动计算工资&#xff08;全勤、请假、旷工、加班、迟到、早退等计算出最终实发工资&#xff09;&#xff0c;员工还可以查看自己的考勤记录工资具体组成等。升级版加了部长…

Linux——信号知识归纳(中)

目录 一.信号与硬件异常 二.阻塞信号和信号结构 &#xff08;一&#xff09;.信号状态 &#xff08;二&#xff09;.信号结构 ①pending表 ②block表 ③handler表 &#xff08;三&#xff09;.信号处理过程 &#xff08;四&#xff09;.阻塞与忽略的区别 &#xff08…

Linux 中断子系统(二):GIC 中断控制器

GIC 是 ARM 公司给 Cortex-A/R 内核提供的一个中断控制器,类似 Cortex-M 内核(STM32)中的 NVIC。 GIC:Generic Interrupt Controller,通用中断控制器 NVIC:Nested Vectored. Interrupt Controller,嵌套向量中断控制器目前 GIC 有 4 个版本:V1 ~ V4,V1 是最老的版本,已…

react源码解析20.总结第一章的面试题解答

总结 至此我们介绍了react的理念&#xff0c;如果解决cpu和io的瓶颈&#xff0c;关键是实现异步可中断的更新 我们介绍了react源码架构&#xff08;uifn(state)&#xff09;&#xff0c;从scheduler开始调度&#xff08;根据过期事件判断优先级&#xff09;&#xff0c;经过r…

测试开发 | Jenkins job 机制该如何使用?

Jenkins 像老板一样管理各种 job 。job 是 Jenkins 的一个执行计划&#xff0c;是一系列操作的集合&#xff0c;Jenkins 里的最常用的功能就是 job 的构建&#xff0c;即任务的构建。通过构建 job 即可让工人为你工作。 image806387 84.3 KB 创建 job及配置步聚 可以通过如下步…

C#,图像二值化(20)——全局阈值的耶恩算法(Yen Thresholding)及源代码

1 全局阈值的耶恩算法&#xff08;Yen Throsholding&#xff09;常见阈值算法1.1黄算法HuangThresholdImageFilter使用Shannon的熵函数实现Huang的模糊阈值[1]。模糊性度量表示原始图像与其二进制版本之间的差异。对于给定的阈值级别&#xff0c;像素的模糊隶属度函数由像素灰度…

Java中常用API总结(7)—— BigDecimal类

BigDecimal类一、前言二、概述1.API帮助文档2.使用方法三、常见方法1.格式2.实例3.报错4.解决方法四、结语一、前言 在使用float或者double类型的数据在进行数学运算的时候&#xff0c;很有可能会产生 精度丢失问题 我们都知道计算机底层在进行运算的时候&#xff0c;使用的都…

Echarts image 使用

通过image://...xx.png 在扇形图中可能会失败&#xff0c;可以将需要载入的img转换成base64直接载入可以通过背景色来载入图片 backgroundColor: {image: xxx/xxx.jpg },实例&#xff08;扇形图&#xff09;&#xff1a;var option {tooltip: {trigger: "item",show…

如何用用C++实现通达信接口调用?有哪些技巧

c作为三大计算机语言之一&#xff0c;在编程时很受投资者的偏爱&#xff0c;特别是在通达信接口软件开发时C更是担任着重要的开发角色&#xff0c;今天小编就来和大家说一下如何用C实现通达信接口调用&#xff1f; 用C查询股份数据代码&#xff08;部分&#xff09; std::cou…

C4D和Maya哪个学起来更容易

Maxon Cinema 4D和 Autodesk Maya 是最著名的两种 3D 软件&#xff0c;艺术家和工作室经常在许多领域使用它们。它们都有不同的功能&#xff0c;在本文中&#xff0c;让我们对它们进行比较。我们将尝试向您概述它们之间的主要区别&#xff0c;以及这两者的功能。哪一个更容易使…

2: [SpringData集成Elasticsearch] --- 配置打印命令日志

文章目录一&#xff1a;引入SpringDataElasticsearch依赖二&#xff1a;创建RestHighLevelClient配置类三&#xff1a;配置YML&#xff1a; logging.level --- 日志等级三&#xff1a;请求接口&#xff0c;查看日志3.1&#xff1a;请求代码3.2&#xff1a;Postman请求地址3.3&a…

LayoutInflater学习(一)之布局解析

LayoutInflater的创建与实例化 LayoutInflater是位于 "android.view" 包下的一个抽象类,同样它也是一个系统级服务 package android.view; SystemService(Context.LAYOUT_INFLATER_SERVICE) public abstract class LayoutInflater { LayoutInflater是用来解析 xml…