指针面试笔试题练习

news2024/12/30 2:43:20

在这里插入图片描述

前言

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻推荐专栏: 🍔🍟🌯 c语言进阶
🔑个人信条: 🌵知行合一
🍉本篇简介:>:介绍c语言中有关指针更深层的知识.
金句分享:

✨星光不问赶路人,✨
✨时光不负有心人。✨

目录

  • 前言
  • 笔试题1
    • 文字解释1:
    • 图解1:
  • 笔试题2
    • 文字解释2:
  • 笔试题3
    • 文字解释3:
    • 图解3:
  • 笔试题4
    • 文字解释4:
  • 笔试题5
    • 文字解释5:
    • 图解5:
  • 笔试题6
    • 图解6:
  • 笔试题7
  • 笔试题8(难度提升)
    • 分析1: ** ++cpp
      • 分步动态图解1:
    • 分析2:*-- * ++cpp + 3
      • 分步动态图解2:
    • 分析3:*cpp[-2] + 3
      • 分步动态图解3:
    • 分析4:cpp[-1][-1] + 1
      • 分步动态图解4:

笔试题1

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

在这里插入图片描述
答案:
运行结果:

2,5

文字解释1:

a是数组名,类型为int[5],则&a类型为int(*)[5],当&a+1时,一次会跳过5个整形数据,则指向a数组的最后一个元素的后一个位置,ptr - 1刚好指向a数组的最后一个元素,解引用(星号)就会得到整形数字5.
a+1表示数组的第二个元素,所以解引用得到整形数字2.

图解1:

在这里插入图片描述

笔试题2

不了解指针运算的可以点击这里哦!
[传送门]
考点:指针+1,跳过的步长

题目2:

#include <stdio.h>
//已知结构体Test的大小是20字节
struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p;
int main()
{
	p = (struct Test*)0x100000;//假设p 的值为0x100000。
	printf("%p\n", p + 0x1);//0x100020
	printf("%p\n", (unsigned long)p + 0x1);//0x10
	printf("%p\n", (unsigned int*)p + 0x1);
	return 0;
}

在这里插入图片描述
运行结果:

00100014
00100001
00100004

文字解释2:

p + 0x1:
因为p是一个结构体指针,结构体的大小是20个字节,所以p+0x1会跳过20个字节,20转化为16进制表示是14.

(unsigned long)p + 0x1:
这里需要注意的是,这里将p强制转化为无符号长整形,并不是无符号长整形指针,所以,+0x1只是正常的+1,就好比1+1=2,就只是变量之间的正常+1.

(unsigned int*)p + 0x1
将p指针强制转化为无符号整形指针,因为无符号整形是四个字节,则+0x1会跳过四个字节,转化为16进制4.

笔试题3

题目3:
环境:x86 小端环境

#include <stdio.h>
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,2000000

文字解释3:

ptr1
因为&a + 1表示跳过a数组,指向a数组最后一个元素的后一个位置.
ptr1[-1]等价于 *(ptr-1),即解引用得到数组的最后一个元素4.

ptr2:需要注意的是,向后偏移了一个字节.
(int)a + 1,表示将a强制转化为int整形,整形+1就是正常的+1,则会向后偏移一个字节,
(int*)((int)a + 1)再强制转化为整形指针,在小端存储模式下,会从首元素1(占四个字节)的第二个字节开始,向后读取四个字节(红色框框).这时按16进制打印出来就是2000000了.

图解3:

在这里插入图片描述

笔试题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;
}

运行结果:

1

文字解释4:

是不是感觉很奇怪,不应该是0吗?
a[0]表示二维数组的第一行的数组名,那么p[0]就等价于a[0][0],就是0呀.
实际本题考察重点是在逗号表达式.
? ? ?
这才是二维数组的初始化:用的是{}
int a[3][2] = { {0, 1 }, {2, 3}, {4, 5} };
而上面用的是(),则编译器会认为是逗号表达式,只保留后面的结果.
等价于:
int a[3][2] = { (0, 1), (2, 3), (4, 5) }; ====== int a[3][2] = { 1, 3, 5 };
故二维数组的初始化结果是
1 3
5 0
0 0
第一行第一个元素是1.做题要仔细哦,掉坑里了.

笔试题5

题目:

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

在这里插入图片描述
运行结果:

FFFFFFFC,-4

文字解释5:

a是二维数组的数组名,类型是int ()[5],一次跳过五个整形
p是一个数组指针,类型是int(
)[4],一次跳过四个整形,
a[4][2]与p[4][2]之间差了4个字节,即&p[4][2] - &a[4][2]=-4;
-4按"%p"形式打印.会认为内存中的数据是内存.-4在内存中是按补码存的.

-4
1000 0000 0000 0000 0000 0000 0000 0100原码
1111 1111 1111 1111 1111 1111 1111 1011反码
1111 1111 1111 1111 1111 1111 1111 1100补码
转化为16进制表示地址后:F F F F F F F C

图解5:

在这里插入图片描述

笔试题6

题目:

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

解释:
看图理解方便(偷个懒)

图解6:

在这里插入图片描述

笔试题7

题目:

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

在这里插入图片描述
运行结果:

at

解释:

a是一个字符指针,类型是char*,a+1会跳过一个char类型.
pa是一个二级指针,类型是char**,pa+1会跳过一个char*.即指向数组的第二行,%s从该地址处向后打印直到遇到’\0’.

动图解析:

在这里插入图片描述

笔试题8(难度提升)

#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);			//1
	printf("%s\n", *-- * ++cpp + 3);	//2
	printf("%s\n", *cpp[-2] + 3);		//3
	printf("%s\n", cpp[-1][-1] + 1);	//4
	return 0;
}

在这里插入图片描述
运行结果:

POINT
ER
ST
EW

解释分析:
需要注意的是,当进行自增(++)或者自减(–)时,会真正改变指针的值,从而影响后面的语句.而加减整数或者访问元素([ ])并不会改变指针本身.并不会对后面的语句造成影响.

c是一个字符指针,+1会跳过一个字符(1字节).
cp是一个指向一级字符指针二级指针,+1可以跳过一个char*类型指针.
cpp是一个指向cp的三级指针,+1会跳过一个二级指针.

分析1: ** ++cpp

原始状态图:
在这里插入图片描述

++cpp会跳过一个二级指针,并且是真正改变cpp指针的内容,
cpp会指向cp的第二个元素,c+2
*++cpp表示得到c+2的地址
**++cpp表示得到c+2的值,即P的地址,按%s打印会得到,POINT.

分步动态图解1:

在这里插入图片描述

分析2:*-- * ++cpp + 3

注意!!!
cpp由于1的改变,现在指向的是c+2.

原始图2:
在这里插入图片描述

++cpp会使cpp指向c+1(cp的第二个元素).
*++cpp得到c+1的地址
- - *++cpp表示c+1的地址–,会会指向c
*-- * ++cpp 会得到c的地址
*-- * ++cpp + 3表示指向E
按%s打印会打印ER.

分步动态图解2:

在这里插入图片描述

分析3:*cpp[-2] + 3

注意!!!
因为2的改变,此时cpp指向的是c+1.

图三原始图:
在这里插入图片描述

cpp[-2]等价于*(cpp-2),表示访问cpp指向的元素,往前找两个位置,即cp的第一个元素,c+3,
*cpp[-2]解引用得到c+3的地址.
*cpp[-2] + 3,表示指向c+3的第3个字符.
按%s打印,结果为ST

分步动态图解3:

在这里插入图片描述

分析4:cpp[-1][-1] + 1

注意!!!
3只是[-2]访问,并没有改变cpp本身.
原始图四:(与图三一样)
在这里插入图片描述

cpp[-1]等价于*(cpp-1),表示访问cpp指向的内容的前一个,即c+2(cp的第二个元素).
cpp[-1][-1]表示访问c+2地址的前一个,即N地址处.
cpp[-1][-1] + 1表示从N地址的下一个地址,E开始.
按%s打印是EW

分步动态图解4:

在这里插入图片描述
这次的指针面试题练习就讲到这里,希望对各位有所帮助.
886.
在这里插入图片描述

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

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

相关文章

webGL编程指南实战教程

学习路线&#xff1a; 如果你是在校大学生&#xff0c;有足够的时间去学习&#xff1a;前端>数学&#xff08;几何线性代数&#xff09;>图形学>webgl>shader >threejs>three.js源码如果你是工作中使用&#xff0c;需要快速出产成品&#xff1a;前端>thr…

【博学谷学习记录】超强总结,用心分享 | 架构师 JDK源码学习总结

文章目录HashMap类1.定义2.哈希表3.JDK1.8前HashMap的数据结构4.JDK1.8后HashMap的数据结构5.类构造器6.字段属性①Node<K,V>[] table②size③loadFactor④threshold7.构造函数①默认无参构造函数②指定初始容量的构造函数8.确定哈希桶数组索引位置9.添加元素10.扩容机制…

操作系统重难点笔记

1.信号量机制&#xff0c;读者/写者问题 读者/写者问题分为两种情况&#xff1a; 1.读者和写者互斥&#xff0c;并且不同的读者和写者之间都互斥,一共三个互斥 下面给出伪代码 int m1; int mr1; int mw1; int count0; writer() {while(1){P(mw);........V(mw);} } reader() {…

防止暴力破解ssh的四种方法

一. 方法介绍 防止暴力破解的四种方法&#xff1a; 1 密码要写的足够的复杂&#xff0c;通常建议将密码写16位&#xff0c;并且无连贯的数字或者字母&#xff1b;当然也可以固定一个时间修改一次密码&#xff0c;推荐是一个月修改一次会稳妥一些2 修改ssh的端口号&#xff0c;…

【剧前爆米花--爪哇岛寻宝】MySQL中索引和事务

作者&#xff1a;困了电视剧 专栏&#xff1a;《MySQL数据库》 文章分布&#xff1a;这是一篇关于Java中异常类的文章&#xff0c;在本篇文章中详细讲解了异常的使用逻辑和底层的执行过程&#xff0c;如有疏漏&#xff0c;欢迎大佬指正&#xff01; 目录 索引 用法 底层逻辑…

中医药NER命名实体识别基于SPANNER方式

一个不知名大学生&#xff0c;江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.3.5 Last edited: 2023.3.5 导读 本文使用SPANNER方式实现对中医药进行实体识别&#xff0c;采用focal loss 进行优化。 本文章作用防止安静…

【微信小程序】计算器案例

&#x1f3c6;今日学习目标&#xff1a;第二十一期——计算器案例 ✨个人主页&#xff1a;颜颜yan_的个人主页 ⏰预计时间&#xff1a;30分钟 &#x1f389;专栏系列&#xff1a;我的第一个微信小程序 计算器前言实现效果实现步骤wxmlwxssjs数字按钮事件处理函数计算按钮处理事…

为啥一个 main 方法就能启动项目

在 Spring Boot 出现之前&#xff0c;我们要运行一个 Java Web 应用&#xff0c;首先需要有一个 Web 容器&#xff08;例如 Tomcat 或 Jetty&#xff09;&#xff0c;然后将我们的 Web 应用打包后放到容器的相应目录下&#xff0c;最后再启动容器。 在 IDE 中也需要对 Web 容器…

【WEB前端进阶之路】 HTML 全路线学习知识点梳理(中)

前言 本文是HTML零基础学习系列的第二篇文章&#xff0c;点此阅读 上一篇文章。 文章目录前言六.HTML标题1.HTML标题2.HTML水平线3.HTML 注释七.HTML段落1.HTML段落2.HTML换行八.HTML文本格式化九.HTML链接十.HTML头部十一.HTML图像十二.HTML表格十三.HTML列表十四.HTML区块1.H…

C#:Krypton控件使用方法详解(第十二讲) ——kryptonCheckButton

今天介绍的Krypton控件中的kryptonCheckButton。下面先介绍外观属性&#xff1a;Checked属性&#xff1a;表示控件是否处于已启用状态&#xff0c;属性值为Bool类型&#xff0c;属性值为true时&#xff0c;表示控件处于已选中状态。属性值为false时&#xff0c;表示控件处于不选…

黄河流域公安院校网络空间安全技能挑战赛 QAQ 题解

目录 一.获取pyc文件 二.反编译出.py源码 三.程序逻辑 1.第一个限制条件 2.第二段 3.第三段 这题是对python打包成的可执行程序逆向 如果对如何反编译.pyc和.py文件有疑问可以参考: Python逆向基本操作步骤——以杭电新生赛hgame week2 reverse stream(python3.10逆向)…

IOC(概念和原理)

文章目录1. IOC容器概念2. IOC底层原理3. IOC&#xff08;接口&#xff09;4. IOC操作Bean管理&#xff08;概念&#xff09;5. IOC操作Bean管理&#xff08;基于xml方式&#xff09;5.1 基于xml创建对象5.2 基于xml方式注入属性5.2.1 DI&#xff1a;依赖注入&#xff0c;就是注…

Unable to find a valid cuDNN algorithm to run convolution

Unable to find a valid cuDNN algorithm to run convolution 今天在复习HumanNerf的时候发现了这个报错&#xff0c; import torch print(torch.cuda.is_available()) 使用上面的代码发现GPU是可以用的&#xff0c;可自己的torch版本对应。 后面继续看帖子&#xff0c;总结有…

【C++】30h速成C++从入门到精通(STL介绍、string类)

STL简介什么是STLSTL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。STL的版本原始版本Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本&…

2D图像处理:九点标定_上(机械手轴线与法兰轴线重合)(附源码)

文章目录 1. 九点标定2. 九点标定流程2.1 机械手轴线与法兰轴线重合代码实现1. 九点标定 在2D视觉抓取项目中,如果想要让机械手准确的抓取到工件,前提是需要知道机械手应该移动到哪里(位姿)。而移动到哪里(位姿)的获取就需要对相机和机械手进行标定。因此,九点标定(2D视…

ESP32设备驱动-MAX6675冷端补偿K热电偶数字转换器

MAX6675冷端补偿K热电偶数字转换器 1、MAX6675介绍 MAX6675执行冷端补偿并将来自K型热电偶的信号数字化。 数据以 12 位分辨率、SPI™ 兼容的只读格式输出。 该转换器可将温度解析为 0.25C,读数高达 +1024C,并且在 0C 至 +700C 的温度范围内具有 8 LSB 的热电偶精度。 MAX…

力扣旋转字符串

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言初阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:介绍字符串旋转,左旋,右旋即旋转结果. 金句分享: ✨好好干&…

如何通过Java将Word转换为PDF

Word是我们日常编辑文档内容时十分常用的一种文档格式。但相比之下&#xff0c;PDF文档的格式、布局更为固定&#xff0c;不易被更改。在保存或传输较为重要的文档内容时&#xff0c;PDF文档格式也时很多人的不二选择。很多时候我们都会遇到需要将Word转换为PDF的情况。下面我就…

放弃node-sass,启用sass

在下载一个新项目时运行&#xff1a;npm run install 发现报错 npm uninstall 异常 Error: Could not find any Visual Studio installation to use 或是 ------------------------- You need to install the latest version of Visual Studio npm ERR! gyp ERR! find VS incl…

嵌入式Linux(二十四)系统烧写

将uboot&#xff0c;linux kernel&#xff0c;.dtb&#xff0c;rootfs烧写到板子上的EMMC上&#xff0c;避免断网导致不能运行。 1. MfgTool工具介绍 一路解压之后&#xff0c;得到以下两项&#xff1a; ①Profiles文件夹&#xff1a;后续烧写文件放到这个文件夹。  其中关注…