指针笔试题分享

news2024/10/5 17:16:54

今天给大家分享几道关于指针的好题,我觉得的只要是题,都是好题咯!下面来看看我们今天的题吧!

题目一:

#define _CRT_SECURE_NO_WARNINGS 1
#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;
}

数组a里面有5个元素,下面定义了一个整形指针变量指向了(int*)(&a+1),那么我们现在主要就是找到指针变量ptr所指向的位置:

 如图所示,就是我们ptr所指向的位置,下面对其*(a + 1),那么此时就指向2的地址了,再对其简引用,那么就是我们的2了。 *(ptr - 1)指针ptr-1就指向了我们5的地址了。所以我们的最终结果为2,5!


 题目二:


#define _CRT_SECURE_NO_WARNINGS 1
#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环境下,假设结构体的⼤⼩是20个字节,程序输出的结构是啥?

p是我们的结构体指针,p+0x1这里就是我们的结构体指针加一了,那么此时加的就是一个结构体的大小,上面告诉我们了为20个字节,那么p+0x1 = 0x100000+20 = 0x100014(这里是十六进制)!

第二个被强制转换为无符号长整形了,那么此时就是就是整数的加减运算了,p+0x1 = 0x10000+1=0x100001!

第三个被强制转换为一个整型指针类型了,此时在X86的环境下,指针的大小为4个字节,那么p+0x1 = 0x100004!

我们来看看结果:

 题目三:

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

可能大家在看见这道题是,想当然的就知道了数组的排列,

 如果真的这样想的话,其实就错了,注意里面是()而不是{},那么我们就要先进行里面的”,“运算了,所以我们的数组a其实是这样的!

 定义了一个整型指针类型指向我们的a[0],a[0]表示的是第一行的地址,此时就表示首元素的地址,那么p[0]就指向我们的1,所以结果为1!

 


题目四:


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

假设环境是x86环境,程序输出的结果是啥?

有一个数组a有25个元素(5行5列),下面定义了一个数组指针,里面有四个元素,然后p = a!把a的首元素地址给了p!因为二维数组在我们的内存中也是连续存放的,所以我们可以这样画:

 那么此时我们就可以很好的找到位置进行计算了,

 我们知道随着数组下标的增长,地址由低地址指向高地址,所以&p[4][2] - &a[4][2]是一个低地址减一个高地址,地址减地址的绝对值表示之间的元素个数,所以以%d打印时,结果是我们的-4!以%p打印时,以-4作为一个地址来打印,在内存中我们的数是以补码存储的,所以我们打印地址时就是打印-4的补码:

 所以我们的结果为FFFFFFFC和-4!


题目五:

#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是取出的整个二维数组的地址,加一之后就指向了二维数组的后面了,而(aa+1),aa表示首元素的地址,而在二维数组中则表示第一行的地址,加一之后就指向了第二行元素:

 所以ptr-1后指向了10的地址,ptr2-1后则指向了5的地址,所以我们的结果为:10,5


题目六: 

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

a是一个指针数组,里面存放的是char*类型的元素,下面是char** pa = a;表示将a的首元素地址传给了pa,pa指向的对象类型是char*的,我们可画图来作答:

 pa++后指向了a[1],对其简引用之后那么就是打印我们的字符串at了!

 


题目七:

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

C是一个指针数组,数组C里面的元素为char*类型,数组CP里面存放的是char**类型,将C的首元素地址传到CP中,CPP中的元素为char***。我们画图来理解:

 printf("%s\n", **++cpp); 加加cpp,那么之后就跳到了c+2,对其简引用后就指向了我们的c[2],再对其简引用之后便指向了我们的POINT的首地址,那么此时打印的就是我们的 POINT!

 printf("%s\n", *--*++cpp+3); +3的优先级是最低的,所以我们最后算。上面我们的cpp跳到了我们的c+2,然后这里再加加之后就指向了c+1这个位置了,然后再对其简引用,此时就指向了我们的a[1],然后再减减,此时就变为了我们的a[0]了,此时再对其简引用就指向了我们ENTER的首地址,再加三后,指向了我们的E,所以这里我们就打印我们的 ER!

 printf("%s\n", *cpp[-2]+3); cpp[-2]=*(cpp-2),所以此时指向了我们的c+3,对其简引用之后指向了我们的c[3],然后再对其简引用之后就指向了我们FIRST的首元素,之后再加三后就指向了S,所以我们这里打印的是 ST!

 printf("%s\n", cpp[-1][-1]+1);cpp[-1][-1] = *(*(cpp-1)-1),cpp-1后指向了c+2了,然后再对其简引用后便指向了我们的c[2]了,之后再减一就就跳到我们的c[1]了,然后再对其简引用之后便指向了NEW的首地址,然后加一指向了E,所以最后打印的是我们的EW!

所以所做这类似的题时:画图对我们的帮助是非常大的,一定要多画图来看看!不知道你看完之后有没有些感触,哈哈,如果有的话,点个赞吧!

拜拜咯,我们下期再见!

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

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

相关文章

ESP32 ESP-IDF5.1 在Visual Studio Code中自定义分区表与调整Flash大小

好记心不如烂笔头 使用ESP-IDF开发ESP32的时候,要是同时用到蓝牙和WIFI的话,很多时候会提示Flash不够, 我是照着这样解决的,存档记录 来源 : zaixingxing2539 大佬的 ESP32 ESP-IDF5.0 在VSCODE中自定义分区表 用Visual Studio Code自定义分区表 # ESP-IDF Partition Table…

OpenCV滑块验证码图像缺口位置识别

OpenCV图像缺口位置识别 1、背景2、图像缺口位置识别原理3、图像缺口位置识别实现4、滑块验证码HTTP图像需要保存到本地吗1、背景 在使用Selenium完成自动化爬虫时,许多网站为了防止机器人爬取数据会使用验证码(例如滑块验证码)。通过Selenium动作操作,爬虫可以模拟用户输入…

测试设备的选型

随着科技的不断发展和进步&#xff0c;各行各业都在积极地进行产业升级和转型。在这个过程中&#xff0c;各种测试设备发挥着不可或缺的作用。如何选择合适的测试设备&#xff0c;成为了企业生产过程中必须面对的重要问题。本文将探讨测试设备的选型&#xff0c;为企业提供一些…

医院供暖换热站远程监控案例

医院供暖换热站远程监控案例 本文针对医院换热站远程监控系统存在的问题&#xff0c;提出了一种基于物联网技术的解决方案。通过使用云平台功能&#xff0c;实现对换热站设备的远程监控和管理&#xff0c;提高系统运行效率&#xff0c;降低运维成本。 一&#xff0e;痛点 1、…

网络运维与网络安全 学习笔记2023.11.24

网络运维与网络安全 学习笔记 第二十五天 今日目标 DHCP中继代理、三层交换机DHCP、子网划分的原理、子网划分的应用 项目需求分析、技术方案选型、网络拓扑绘制 基础交换网络设计、内网优化、连接外网服务器 DHCP中继代理 DHCP中继概述 场景&#xff1a; DHCP客户端与DH…

【算法心得】When data range not large, try Bucket sort

https://leetcode.com/problems/maximum-number-of-coins-you-can-get/description/?envTypedaily-question&envId2023-11-24 I solve this problem by sorting piles first, and choose piles for(let i1;i<(piles.length/3)*2;i2) but: o(≧口≦)o Problem must …

yarn:无法加载文件 C:\Users\***\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本

原因&#xff1a;PowerShell 脚本的执行有着严格的安全策略限制&#xff01; 解决方案&#xff1a;管理员身份启动Windows PowerShell 在命令行中输入set-ExecutionPolicy RemoteSigned 再使用yarn就可以了

Doris中的物化视图(十八)

物化视图就是包含了查询结果的数据库对象&#xff0c;可能是对远程数据的本地 copy&#xff0c;也可能是一个表或多表 join 后结果的行或列的子集&#xff0c;也可能是聚合后的结果。说白了&#xff0c;就是预先存储查询结果的一种数据库对象。 在 Doris 中的物化视图&#xf…

ate测试原理及ate测试系统(软件)知识科普 -纳米软件

ATE(Automatic Test Equipment)测试也叫自动化测试&#xff0c;通过计算机控制测试仪器对被测对象进行测试。以计算机编程代替人工测试&#xff0c;基于测试程序控制仪器并对待测品进行输入和输出信号检测分析&#xff0c;从而判断待测品的性能是否符合要求。 ATE测试需要根据测…

土壤教学经典用图30张

一、土壤分布 二、土壤形成与气候 三、土壤形成与地形 四、土壤形成与成土母质 五、成土过程示意图 六、土壤剖面实景图 七、土壤剖面示意图 八、土壤质地 以上图片多来源于 人教、湘教、鲁教、中图、沪教 五套新教材及地图册

电脑端有没有可以定时提醒工作计划的时间管理软件?

时间管理对职场人士来说非常重要&#xff0c;因为它可以帮助我们更有效地完成工作任务、提升工作效率、达到职业目标、更好地平衡工作和生活等方面。通过时间管理&#xff0c;我们可以更好地把握自己的工作进度&#xff0c;合理安排自己的时间&#xff0c;提高工作效率。 但是…

YOLOv3老矣尚能战否?基于YOLOv3开发构建建钢铁产业产品智能自动化检测识别系统,我们来与YOLOv5进行全方位对比评测

钢铁产业产品智能自动化检测识别相关的项目在我们前面的博文中已经有了相应的实践了&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a;《python基于DETR(DEtection TRansformer)开发构建钢铁产业产品智能自动化检测识别系统》 《AI助力钢铁产业数字化&#xff0c;pytho…

IDEA必备插件!一键生成接口文档

IDEA是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它可以帮助开发人员更加高效地编写、调试和部署软件应用程序。我们在编写完接口代码后需要进行接口调试等操作&#xff0c;一般需要打开额外的调试工具&#xff0c;而今天给大家介绍一款IDEA插件&…

zlmediakit实现rtsp流服务器

本次实现是将内存中的H264数据经过zlmediakit实现为rtsp流。 我是用的是CAPI的方式&#xff0c;将zlmediakit作为一个sdk嵌入到自己的程序中而不是作为一个独立的进进程服务。 1.编译完成zkmedialit后会得到bin include lib三个文件夹如图 其中bin中的MediaServer是作为独立的…

JavaFx 设置窗口边框圆角

UI界面要求窗口边框有一定弧度&#xff0c;因为之前没有做过&#xff0c;网上看了很多文章&#xff0c;都用到了css语句 "-fx-background-radius: ; 我在xml布局文件根节点使用无效&#xff0c;在Scene组件设置无效&#xff0c;gpt等ai问了一圈代码也是无效&#xff0c;…

【深度学习】P1 数据缺失值预处理

数据缺失值预处理 创建数据集展示数据集缺失值处理 创建数据集 首先创建一个人工数据集&#xff0c;作为下文对数据缺失值预处理的案例&#xff0c; import osos.makedirs(os.path.join(.., data), exist_okTrue) data_file os.path.join(.., data, house_tiny.csv) with op…

GEE:生成超链接方式下载影像

作者:CSDN @ _养乐多_ 本文将介绍如何使用Google Earth Engine(GEE)平台以生成下载超链接的形式下载遥感数据。 结果如下图所示,只需点击链接,即可下载数据到本地。 文章目录 一、函数详解二、代码示例一、函数详解 用法返回值Image.getDownloadURL(params, callback)Ob…

vue3中引入svg矢量图

vue3中引入svg矢量图 1、前言2、安装SVG依赖插件3、在vite.config.ts 中配置插件4、main.ts入口文件导入5、使用svg5.1 在src/assets/icons文件夹下引入svg矢量图5.2 在src/components目录下创建一个SvgIcon组件5.3 封装成全局组件&#xff0c;在src文件夹下创建plugin/index.t…

(11_23)构建高效数据流转的 ETL 系统:数据库 + Serverless 函数计算的最佳实践

作者&#xff5c;柳下 概述 随着企业规模和数据量的增长&#xff0c;数据的价值越来越受到重视。数据的变化和更新变得更加频繁和复杂&#xff0c;因此及时捕获和处理这些变化变得至关重要。为了满足这一需求&#xff0c;数据库 CDC&#xff08;Change Data Capture&#xff…