指针-->笔试题(必备)

news2024/9/23 11:16:31

前言:

目录

前言:

        本章介绍的指针笔试题是有点难度的,得花费一点时间来理解,并且我们在做题目的时候需要画图来理解。

文章目录

        笔试题1

        笔试题2

        笔试题3

        笔试题4

        笔试题5

        笔试题6

        笔试题7

        笔试题8


笔试题1

        

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),这里的a是数组名,代表的是数组首元素的地址,类型为int*,整形指针加1跳过一个整形,所以a+1代表的是数组中第二个元素的地址,*(a+1)则代表第二个元素,所以就是2.

        对于*(ptr-1),首先我们需要知道ptr是一个int*类型的指针,&a代表的是整个数组的地址,类型为int(*)[5],所以&a+1则代表跳过一个数组的大小,但是ptr却是将它强制类型转换为int*类型的指针,所以ptr-1代表指针向后跳过一个整形。

笔试题2

//由于还没学习结构体的计算,这里告知结构体的大小是20个字节

struct Test
{
 int Num;
 char *pcName;
 short sDate;
 char cha[2];
 short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
int main()
{
 printf("%p\n", p + 0x1);
 printf("%p\n", (unsigned long)p + 0x1);
 printf("%p\n", (unsigned int*)p + 0x1);
 return 0;
}

    公布答案->

那么为什么答案是这个呢,接下来我们先将我们需要的图画出来->

 

 解释:

        首先对于0x1的理解,我们将其理解为1就行

        p是一个结构体的指针p+1则代表跳过,一个结构体的大小又因为结构体的大小为20个字节,且地址是以16进制表示的,而20的16进制为14,所p+1的地址为0x100014

        unsigned long是无符号整形,(unsigned long)则表示将p强制类型转换为一个无符号整形,又因为整形加1所以结果为0x100001

        unsigned int*是无符号整形指针,先将p强制类型转换为无符号整型指针,+1代表跳过一个无符号整形,所以地址加4,所以结果为0x100004

笔试题3

        

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

公布答案->

图->

 

 解释:

       &a+1,代表的是跳过一个数组后的地址类型为,int(*)[4],但是前面将其强制类型转化为(int*),ptr[-1]--->*(ptr-1),也就是4。

        *ptr2:在解释这个之前我们需要知道我的机器是按小段字节序存储的,且数组随着下标的增加,元素的地址也是增加的,小段字节序是低字节的内容在低地址存储,所以才有了上面的图像,先将a转化为整形然后加1,即地址加1,得到的是向后移动一位的数字,然后在转化为地址,即向后移动一个字节的地址,然后再解引用访问4个字节的内容,%x是以16进制打印,为0x02000000.打印时前面不打印0,所以未2000000

 总结:这道题考了数组在内存中的地址分布,考了机器的大小端字节序存储,考了*访问的时候字节的个数

笔试题4

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

公布答案:

图:

 解释:

        首先我们要注意的是数组内容的初始化是0 1 2 3 4 5?       并不是,而是1,3,5,0,0,0,为啥呢?因为我们要注意,(0,1)这里面的逗号是一个逗号表达式,取右边的结果。

a[0]的理解:因为a是一个二维数组,在内存中我们可以将它看成由3个一维数组组成的,所以a[0]代表的是第一个一维数组的数组名即一维数组的地址,p为整形指针,所以p[0]--->*(p+0)--->&(a[0]+0)--->(a[0][0]),所以为1.

笔试题5

        

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

答案:

图:

解释:

        因为p是一个int(*)[4]类型的指针p又是指向a的,所以p+4跳过4个数组int[4],随着下标的增加数组的地址也是增加的,且指针减指针为两个指针之间相差元素的个数

所以差4,但是地址前面小所以答案为-4

%p打印数字的时候是直接将-4的补码看作地址所以为FFFFFFFC

笔试题6

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为数组名,数组名就是首元素的地址,也就是第一个一维数组的地址类型为  int(*)[5],aa+1则代表跳过一个一维数组,指向a[1],然后在强制类型转化为,int*的指针,解引用则只访问一个字节的内容.

&aa代表的是取出整个二维数组的地址,类型为int(*)[2][5],+1则代表跳过一个二维数组,然后强制类型转化为整形指针,-1代表指针向前跳过一个整形.

笔试题7:

        

int main()
{
 char *a[] = {"work","at","alibaba"};
 char**pa = a;
 pa++;
 printf("%s\n", *pa);
 return 0;
}

图:

 

解释:

        这个数组a存储了3个常量字符串的地址a代表首元素的地址,即常量字符串的地址,类型为char** ,+1则代表跳过一个常量字符串,所以指向at,所以答案就是at

笔试题8

        

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:首先cpp是c+3的地址,+1则代表c+2的地址,*(c+2)得到的是point地址的地址**(c+2)则代表得到的是point的地址,所以打印为point

        * -- *++ cpp+3:此时的++cpp代表的是c+1的地址,*(cpp)得到的是c+1,--得到的是c,再解引用得到的是字符串enter首元素的地址,+3的道德是'E'的地址。

        *cpp[-2]+3:首先cpp[-2]代表的是*(cpp-2),得到的是(c+3),*(c+3)又得到的是F的地址+3得到的是'S'的地址,所以打印结果为ST

        cpp[-1][-1]+1:cpp[-1]代表的是*(cpp-1),也就是c+2,cpp[-1][-1]则代表*(c+2-1),所以得到的是'N'的地址+1,则代表得到的是'E'的地址。

        本章完,感谢观看希望对你有所收获!

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

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

相关文章

uniapp下载和上传照片

利用uniapp开发的时候&#xff0c;需要下载和上传照片&#xff0c;在H5和微信小程序中的写法不一样。 H5环境下 浏览器中下载就是模拟超链接下载。也不需要获取什么权限&#xff0c;比较简单。 // #ifdef H5 this.isLoading true; let oA document.createElement("a&…

[软件工具]姓氏谐音梗随机生成工具使用教程

首先我们打开软件 输入姓氏和生成数即可开始生成&#xff0c;注意生成数可以随便填&#xff0c;软件会自动按最大数生成&#xff0c;比如你设置生成数位10000则可能只会生成500个&#xff0c;因为软件内置只有这么多。单次生成不重复&#xff0c;生成效果可以访问视频教程&…

MySQL多表查询练习

多表连接查询 use mydb3; -- 创建部门表 create table if not exists dept3( deptno varchar(20) primary key , -- 部门号 name varchar(20) -- 部门名字 );-- 创建员工表 create table if not exists emp3( eid varchar(20) primary key , -- 员工编号 ename varchar(20), --…

数仓建设中最常用模型--Kimball维度建模详解

数仓建模首推书籍《数据仓库工具箱&#xff1a;维度建模权威指南》&#xff0c;本篇文章参考此书而作。文章首发公众号&#xff1a;五分钟学大数据&#xff0c;公众号后台发送“维度建模”即可获取此书籍第三版电子书 先来介绍下此书&#xff0c;此书是基于作者 60 多年的实际业…

leetcode:174. 地下城游戏:动态规划法

174. 地下城游戏 - 力扣&#xff08;Leetcode&#xff09; 恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初…

史上最全Windows下VScode配置大全

文章目录 1、安装Vscode下载安装配置C和中文 2、安装MinGW-w643、检查是否配置成功 1、安装Vscode 下载安装 首先先下载VSCODE&#xff1a; 链接: VScode下载 下载好安装包以后&#xff0c;直接在自己指定目录安装&#xff1a; 配置C和中文 打开VScode的左下角位置&#…

Proteus 8.13安装教程

不涉及版权问题。 1、双击“Proteus 8.13 SP0 Pro.exe”开始安装 2、按照安装向导进行操作&#xff0c;等待安装成功 1&#xff09;选择“Browse"自定义安装路径&#xff0c;再点击&#xff1a;Next 2&#xff09;点击&#xff1a;Next 3&#xff09;等待一段时间&#xf…

C#学习之路-判断

判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。 下面是大多数编程语言中典型的判断结构的一般形式&#xff1a; 判断语句 语句描述if …

闪烁灯光门铃电路设计

闪烁灯光门铃不仅具有门铃的声音还可以通过家里的门灯发出闪烁的灯光&#xff0c;适合用于室内嘈杂环境时使用&#xff0c;也适用于有聋哑人的家庭。 一、电路工作原理 电路原理如图 30 所示。 由基本的门铃电路和灯光、声音延迟控制电路两部分组成。按下门铃按钮 SB&#x…

C语言每日一题之旋转数求最小值

hello&#xff0c;今天我们分享一道题目&#xff0c;是牛客网上的一道题 求旋转数组中的最小值https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId13&tqId23269&ru/ta/coding-interviews&qru/ta/coding-interviews/question-ranking 那我…

创新指南 | 用这8种商业分析模型,让你得到靠谱的业务创新灵感

当我们想要创新时&#xff0c;往往需要有实际的依据来支撑我们的想法。商业咨询顾问通常被认为是聪明的人&#xff0c;他们拥有模型化的分析思维&#xff0c;这种思维方式可以帮助他们更好地理解市场、竞争对手和客户需求。商业分析思维是一种系统性的思考方式&#xff0c;它可…

P1 第一章 电路模型与电路定律

1、什么是电路模型&#xff1f; 实际电路与电路模型间的关系&#xff1f;建立在相同的电路理论基础之上。 实际电路定义&#xff1a;由电工设备和电气器件&#xff0c;按照预期目的连接构成的&#xff0c;电流的通路。 实际电路的功能&#xff1a;能量方面&#xff0c;可以传输…

【计算机网络】第三章 数据链路层(MAC地址 IP地址 ARP协议)

文章目录 3.7.1 MAC地址3.7.2 IP地址3.7.3 ARP协议 3.7.1 MAC地址 MAC地址&#xff08;Media Access Control address&#xff09;是网络设备&#xff08;如网卡、无线网卡&#xff09;在数据链路层上的唯一标识符。以下是有关MAC地址的一些要点&#xff1a; 描述&#xff1a…

超详细,Jmeter性能测试-模拟100个用户并发(实战)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 100个真实的用户 …

【uniapp调用微信支付】uniapp开发小程序-调用微信支付

哈喽大家好~我是马小跳。一名进阶中的程序媛。 在这里记录下自己成长的每一次进步&#xff0c;希望遇到志同道合的猿友 一起努力&#xff0c;一起把技术up up up&#xff01;&#xff01;&#xff01; 使用uniapp开发小程序时&#xff0c;调用微信支付的步骤如下&#xff1a; …

Web项目中耗时操作,用异步请求,减少请求等待时间,使用Redis保证操作幂等性

最近项目中碰到了一个接口需要比较耗时的操作&#xff0c;但是我们公司前后端交互的网关设置了超时时间。因此我需要设置出一个方案保证给用户比较快的响应&#xff0c;又保证任务执行了。因此我采用了&#xff0c;下面的操作方式。 客户端发送请求后&#xff0c;我会先去Redis…

MySQL数据库,创建表及其插入数据和查询数据

首先&#xff0c;由上图创建表 mysql> create table worker(-> dept_id int(11) not null,-> emp_id int (11) not null,-> work_time date not null,-> salary float(8,2) not null,-> poli_face varchar(10) not null default 群众,-> name varchar(20…

中文模型的奋起直追:MOSS、baichuan-7B和ChatGLM2-6B的原理、部署与微调

第一部分 复旦MOSS MOSS是复旦大学邱锡鹏团队推出的一个支持中英双语和多种插件的开源对话语言模型&#xff0c;moss-moon系列模型具有160亿参数&#xff0c;在FP16精度下可在单张A100/A800或两张3090显卡运行&#xff0c;在INT4/8精度下可在单张3090显卡运行 其基座语言模型…

【React笔记】react循环列表的写法

react循环的写法 简单循环输出人名简单循环输出json格式数组 简单循环输出人名 循环输出people数组中的四个人名 import ReactDOM from react-dom/client;const people [宋江,卢俊义,吴用,公孙胜 ]; const root ReactDOM.createRoot(document.getElementById(root)); root.…

深度学习入门知识总结

0、前言&#xff1a;学习了深度学习入门的鱼书&#xff0c;很多基础概念有了大概了解&#xff0c;及时总结&#xff0c;方便日后查找 1、神经网络&#xff08;深度学习&#xff09;的起源算法——感知机&#xff1a; 定义&#xff1a;感知机接收多个输入信号&#xff0c;输出一…