指针笔试题分享

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

题目一:

#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.hqwc.cn/news/214405.html

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

相关文章

记edusrc一处信息泄露

目录 一、信息收集 二、信息泄露 一、信息收集 在搜索某一学校的资产时&#xff0c;找到了一处学工系统。 登录进去&#xff0c;发现有两种登陆方式&#xff0c;一种是统一身份认证&#xff0c;一种是DB认证。 统一身份认证是需要通过学生的学号和密码进行登录的&#x…

MobaXterm连接节点一段时间后超时Session stopped

1、MobaXterm &#xff08;1&#xff09;设置ssh 超时时间 &#xff08;2&#xff09;设置保持连接 如果服务器端设置了超时时间&#xff0c;会以服务器为准&#xff0c;具体设置&#xff1a; 2、服务端 cat /etc/ssh/sshd_config | grep "ClientAlive" 可以把设置…

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

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

Rust UI开发:使用iced构建UI时,如何在界面显示中文字符

注&#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库&#xff0c;用于为rust语言程序构建UI界面。 iced的基本逻辑是&#xff1a; UI交互产生消息message&#xff0c;message传递给后台的update&#xff0c;在这个函数中编写逻辑&#xff0c;然后通过…

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

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

windows c++ open3D release版本下载与使用

文章目录 open3d库下载路径下载库的使用 Open3D的下载与成功调用&#xff0c;咱们不使用vs来编译。 我开始时候吧&#xff0c;想做个vs编译&#xff0c;后来就是在vs中反复进坑。编译来来去去都是报错。 咱们使用新方法&#xff0c;仅仅修改一两句代码&#xff0c;简单cmd编译即…

NX二次开发UF_CSYS_create_temp_csys 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_create_temp_csys Defined in: uf_csys.h int UF_CSYS_create_temp_csys(const double csys_origin [ 3 ] , tag_t matrix_id, tag_t * csys_id ) overview 概述 Creates …

量子计算突破云渲染资源调度!真机测试完整报告公开!

​摘要&#xff1a;在影视领域中&#xff0c;经常会涉及大量的视频图像渲染工作&#xff0c;而往往在这种大规模、动态渲染场景下&#xff0c;普遍存在着冗余渲染现象。究其原因在于大规模的图像渲染通常要求在短时间内做出渲染任务的算力分配决策&#xff0c;而经典计算机无法…

(10)ATF MMU转换表

MMU简介 MMU&#xff08;内存管理单元&#xff09;负责将软件使用的虚拟地址转换为内存系统中使用的物理地址。MMU包括两个模块&#xff1a;TLB&#xff08;Translation Lookaside Buffer&#xff09;和TWU&#xff08;Table Walk Unit&#xff09;。TLB缓存最近使用的转换&am…

curl添加https服务

CURL支持的通信协议有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。 首选删除系统自带的openssl&#xff0c;因为他只有可执行程序和库&#xff0c;没有头文件。 sudo apt-get remove openssl openssl官网&am…

HarmonyOS 设备管理开发:USB 服务开发指导

基本概念 USB 服务是应用访问底层的一种设备抽象概念。开发者根据提供的 USB API&#xff0c;可以获取设备列表、控制设备访问权限、以及与连接的设备进行数据传输、控制命令传输等。 运作机制 USB 服务系统包含 USB API、USB Service、USB HAL。 图 1 USB 服务运作机制 ●…

数据结构-树

参考&#xff1a;https://www.hello-algo.com/chapter_tree/binary_tree/#711 1. 介绍 树存储不同于数组和链表的地方在于既可以保证数据检索的速度&#xff0c;又可以保证数据插入删除修改的速度&#xff0c;二者兼顾。 二叉树是一种很重要的数据结构&#xff0c;是非线性的…