刷爆指针笔试题

news2025/1/22 15:41:39

第一题

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表示整个数组的地址,+1表示跳过整个数组

它属于数组指针,需要强转成int*类型的指针才能赋给ptr

而ptr属于整型指针,-1跳过四个字节,也就是说(ptr-1)指向对应数字5的位置,解引用之后得到数字5

第二题

struct Test{ 
    int Num; 
    char *pcName; 
    short sDate; 
    char cha[2]; 
    short sBa[4];
}*p;

//假设 p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节

int main()
{ 
    printf("%p\n", p + 0x1); 
    printf("%p\n", (unsigned long)p + 0x1); 
    printf("%p\n", (unsigned int*)p + 0x1); 
    return 0;
}

先自己思考一下,然后再看解析哦


【解析】

p是结构体指针,+1跳过20个字节

注意用16进制表示,0x100000+0x000014=0x100014

-------------------------

p转换成unsigned long类型时正常计算0x100000+0x000001=0x100001

-------------------------

int*类型指针+1跳过4个字节,所以计算方式为0x100000+0x000004=0x100004

第三题

int main()
{    
    int a[4] = { 1, 2, 3, 4 };      
    int *ptr = (int *)((int)a + 1);    
    printf( "%x", *ptr);    
    return 0;
}

先自己思考一下,然后再看解析哦


【解析】

a表示首元素地址,转换成int类型再+1,相当于只是跳过一个字节

我们看该数组再内存中的存储方式(小端存储)

低地址                                                         高地址

01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00

原先首地址读取的内容 0x1

低地址                                                         高地址

01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 移动一个字节后

变成0x2000000

所以输出的内容就是0x2000000

第四题

#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[3][2]={1,3,5}

p表示的是首元素的地址,即第一行的地址,而p[0]表示的是第一行的第一个元素,即1

第五题

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

先自己思考一下,然后再看解析哦


【解析】

a是二维数组,也可以理解为一个数组指针int(*)[5] 

p是一个数组指针int(*)[4]

p = a; //表示将a的首元素地址赋给p

a+1跳过5个整型,而p+1跳过4个整型

为了方便理解,我画了个方便理解的图(此类题目非常建议画图)

注:二维数组在内存中也是连续存放的

先看%d打印的,两个地址相减表示的是两者之间的元素个数,而小地址—大地址为负数,据图可得结果为-4

%p是打印地址,而内存中的存储的补码就是地址

即打印结果为-4的补码0xFFFFFFFC

第六题

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

先自己思考一下,然后再看解析哦


【解析】

a[]是一个字符指针数组,存放的是三个字符串的首地址信息

而pa是二级指针,指向的是a[]数组的首元素地址,a[0]的地址

pa++表示的是pa指向a[]数组的下一个地址,即a[1]的地址

所以打印*pa即表示打印a[]数组中的第二个元素,即"at"

第七题

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

提示:优先级:加号<解引用(间接访问)操作符<自增自减操作符

先自己思考一下,然后再看解析哦


【解析】

根据题目的描述,可以得出初始状态的表示方式:

第一问:
先算自增操作符,所以cpp移到下一位,然后按照连线就可以推出两次解引用后得到的是POINTER

第二问:

先算自增,(注意此处cpp是在第一问的基础上变化的),得在cp+2的位置上,然后自减得c,最后算+3,得ENTER的后两位:ER

第三问(思路与前面类似)

cpp[-2]等价于*(cpp-2),也就是指向cp的位置,存的是c+3的地址,解引用后得FIRST的首地址,最后+3得ST

第四问:
注意此时cpp指向的是cp+2,因为上一问并没有改变cpp的内容,cpp[-1]就是指cp+1的位置,而再算后面的[-1]就是指c+2-1=c+1最后算+1,所以得NEW的后两位EW

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

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

相关文章

LeetCode——哈希表(Java)

哈希表 简介242. 有效的字母异位词349. 两个数组的交集202. 快乐数 简介 记录一下自己刷题的历程以及代码&#xff0c;会尽量把在本地测试包含main函数的完整代码贴上&#xff0c;以及一些注释掉的输出语句。写题过程中参考了 代码随想录。会附上一些个人的思路&#xff0c;如…

LCD屏硬件调光的几种方式

一 前言 最近新开的项目用到了LCD屏&#xff0c;关于LCD屏的调光&#xff0c;主板硬件主要用到了偏压IC与背光IC。关于偏压IC,我们后期再聊&#xff0c;今天主要聊一聊背光IC&#xff0c;以及它的调光方式。 二 LED电路设计 在聊背光IC前&#xff0c;首先要对LCD屏的电压电流…

C++学习day--24 推箱子游戏图像化开发

环境要求&#xff1a; 1、VS2015以上 2、成功安装并配置图形库 项目注意事项&#xff1a;代码复制好以后&#xff0c;把下面的字符集改为多字节字符集 第 1 节 项目需求 实现一款推箱子游戏&#xff0c;效果如下图所示 , 具体规则&#xff1a; 1. 箱子只能推动而不能拉动…

X86 SMAP(Supervisor Mode Access Prevention)机制引入的一个问题分析

在Linux系统中&#xff0c;当涉及到用户态和内核态数据拷贝的时候&#xff0c;如果不考虑建立kernel space和user space的共享映射实现的零拷贝情况&#xff0c;一般是调用copy_from_user/copy_to_user/put_user/get_user几组宏来实现的。在早些时候&#xff0c;对于用户态指针…

STM32F4X SDIO(一) SD卡介绍

STM32F4X SDIO&#xff08;一&#xff09; SD卡介绍 SD卡分类外观分类容量分类传输速度分类 在之前的章节中&#xff0c;讲过有关嵌入式的存储设备&#xff0c;有用I2C驱动的EEPROM、SPI驱动的FLASH和MCU内部的FLASH&#xff0c;这类存储设备的优点是操作简单&#xff0c;但是缺…

同步网盘推荐及挑选指南:便捷、安全、适用的选择

同步网盘是最近热门的文件协同工具之一&#xff0c;因其使用的便捷性受到了诸多用户的青睐。如今网盘市场产品众多&#xff0c;有什么好用的同步网盘&#xff1f;如何挑选同步网盘&#xff1f;是许多需求者关心的问题。 如何挑选同步网盘&#xff1f;在同步网盘挑选过程中要从…

GZ035 5G组网与运维赛题第4套

2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项&#xff08;高职组&#xff09; 赛题第4套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通&#xff08;35分&#xff09; 子任务1&#xff1a;5G公共网络部署与调试&#xff08;15分&#xff09; 子…

详解Jmeter中的BeanShell脚本

BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法&#xff0c;所以它和java是可以无缝衔接的&#xff0c;学了Java的一些基本语法后&#xff0c;就可以来在Jmeter中写写BeanShell脚本了 在利用jmeter进行接口测试或者性能测试的时候&#xff0c…

Vue--》简易资金管理系统后台项目实战(前端)

今天开始使用 vue3 + ts + node 搭建一个简易资金管理系统的前后端分离项目,因为前后端分离所以会分两个专栏分别讲解前端与后端的实现,后端项目文章讲解可参考:后端链接,我会在前后端的两类专栏的最后一篇文章中会将项目代码开源到我的github上,大家可以自行去进行下载运…

C++多态(超级详细版)

目录 一、什么是多态 二、多态的定义及实现 1.多态构成条件 2.虚函数的重写和协变 虚函数重写的两个例外&#xff1a; 2.1协变 2.2析构函数的重写 &#xff08;析构函数名统一处理成destructor&#xff09; 3.重载、覆盖(重写)、隐藏(重定义)的对比 4.final 和 overr…

在本地模拟C/S,Socket套接字的使用

public class SocketTCP01Server {public static void main(String[] args) throws IOException {/**1.在本机的 9999 端口监听 &#xff0c;等待连接细节&#xff1a; 要求在本机没有其他服务在监听999细节&#xff1a;这个ServerSocket 可以通过accept()返回多个Socket[多个客…

指针仪表读数YOLOV8NANO

指针仪表读数YOLOV8 NANO 采用YOLOV8 NANO训练&#xff0c;标记&#xff0c;然后判断角度&#xff0c;得出角度&#xff0c;可以通过角度&#xff0c;换算成数据

End-to-End Adversarial-Attention Network for Multi-Modal Clustering

方法 融合表征h f _f f​ ∑ v \sum_v ∑v​w v _v v​ h v h^v hv 辅助信息 作者未提供代码

2558. 从数量最多的堆取走礼物

2558. 从数量最多的堆取走礼物 难度: 简单 来源: 每日一题 2023.10.28 给你一个整数数组 gifts &#xff0c;表示各堆礼物的数量。每一秒&#xff0c;你需要执行以下操作&#xff1a; 选择礼物数量最多的那一堆。如果不止一堆都符合礼物数量最多&#xff0c;从中选择任一…

Java工具库——Commons IO的50个常用方法

工具库介绍 Commons IO&#xff08;Apache Commons IO&#xff09;是一个广泛用于 Java 开发的开源工具库&#xff0c;由Apache软件基金会维护和支持。这个库旨在简化文件和流操作&#xff0c;提供了各种实用工具类和方法&#xff0c;以便更轻松地进行输入输出操作。以下是 Com…

基于51单片机的温度测量报警系统的设计与制作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、实习目的二、实习任务2.1 设计温度测量报警系统硬件电路2.2 温度测量报警系统软件编程、仿真与调试&#xff1b;2.3 完成温度测量报警系统的实物制作与调试…

【蓝桥每日一题]-前缀和与差分(保姆级教程 篇2)#差分序列

昨天讲的概念和模板&#xff0c;今天讲一个差分序列的好题(好好体会里面的优化思想)&#xff1a; 目录 题目&#xff1a; 思路&#xff1a; 题目&#xff1a; 手动打出样例哈 输入&#xff1a; 输出&#xff1a; 4 …

Android问题笔记四十二:signal 11 (SIGSEGV), code 1 (SEGV_MAPERR) 的解决方法

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

etcd的mvcc源码剖析

mvcc简介 悲观锁 在对于一些临界资源进行读写的时候&#xff0c;为了防止其他人进行同步的修改数据&#xff0c;直接将当前的数据锁住&#xff0c;不让别人使用&#xff0c;来实现并发安全 乐观锁 在对临界资源进行操作的时候&#xff0c;不锁住数据&#xff0c;实现独占&…

锐捷NBR 1300G路由器 越权CLI命令执行漏洞

执行查看版本的命令不需要其它权限&#xff0c; 访问url&#xff1a; /WEB_VMS/LEVEL15/构造payload数据包&#xff1a; POST /WEB_VMS/LEVEL15/ HTTP/1.1commandshow version&strurlexec%04&mode%02PRIV_EXEC&signnameRed-Giant.回显如下&#xff1a; 测试发现…