指针笔试题(C语言进阶)

目录

前言

1、案例一

1.1 答案

1.2 解析

2、案例二

2.1 答案

2.2 解析

3、案例三

3.1 答案

3.2 解析 

4、案例四

4.1 答案

4.2 解析

5、案例五

5.1 答案

5.2 解析

总结


前言

        “纸上得来终觉浅,绝知此事要躬行”。本篇通过对指针实际案例的分析,由浅入深,来加强我们对指针的理解。

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

        先自己想想,下面公布答案。

1.1 答案

        答案是2,5。

1.2 解析

        其实第一个输出的2比较好理解,主要是第二个输出可能会有疑问。

        对于*(a+1),本身a表示数组的首元素地址,a+1表示数组的第二个元素的地址,因此解引用a+1得到的结果就是数组的第二个元素的值:2。(解引用就是*)

        对于*(ptr-1),首先我们看看ptr是什么,前面定义 ptr = (int*)(&a + 1); 首先,&a表示将整个数组的地址取出来,其类型为 (int*)[5],大小是5个整型的大小,所以&a+1直接跳过整个数组,指向数组后面一个位置的地址,但是最后又通过(int*)强制将其转化成了int*类型,步长变回一个整型的大小,所以ptr其实就是指向数组最后一个元素后面一个位置地址的指针,类型为(int*)类型,步长为1个整型数据的大小。因此,输出时,ptr-1其实只往回跳了一个整型大小的长度,指向了数组第五个元素(最后一个元素),再解引用得到的答案就是5啦。

2、案例二

#include <stdio.h>
struct Test
{int Num;char* pcName;short cha[2];short sBa[4];
}*p = (struct Test*)0x100000;
//假设p 的值为0x100000。如下表达式的值分别为多少。
//已知,结构体Test类型的变量大小是20字节。
//x86环境
int main()
{printf("%p\n", p + 0x1);printf("%p\n", (unsigned long)p + 0x1);printf("%p\n", (unsigned int*)p + 0x1);return 0;
}

        这是一道结构体指针的运算,定义结构体*p,其值设定为0x100000。在x86环境下,进行了三种不同的运算,分析结果。

2.1 答案

        答案是:00100014   00100001  00100004

2.2 解析

        对于 p+0x1,是将结构体指针p+1,由于p是结构体指针,所以,其步长为1个结构体的长度,题目说这样一个结构体长度为20(其实可以通过自己计算结构体的内容得出),所以加1直接跳过20个字节,因此输出结果为00100014。(16进制20就是14)。

        对于(unsigned long)p + 0x1,将p强制转换成了无符号长整型,p已经不再是指针,变成了一个长整型1,048,567。加1变成1,048,568。输出时用的%p,也就是地址类型的输出,因此是16进制,1,028,568转换回16进制就是00100001。

        对于(unsigned int*)p + 0x1,将p转化成了无符号整型指针,那其步长就变为了4,p+1就指向4字节后的地址,因此对p+1输出结果为00100004。

3、案例三

        

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

       %x代表16进制输出,来想想这题的答案吧

3.1 答案

        怎么样,算对了吗?

3.2 解析 

        这道题难点在第二个输出,下面我们一个个分析:

        对于ptr1来说,定义时,(int*)(&a + 1);&a取出了整个数组的地址,+1跳过整个数组指向数组最后一个元素后面一个位置的地址, 然后再将它强制类型转换回(int*)类型,步长变回一个整型数据的大小。输出时,ptr[-1]其实就是输出ptr前一个地址的访问值,ptr前一个地址指向的就是数组最后一个元素,因此输出为4.

        对于ptr2来说,定义时,(int*)((int)a + 1);先将a强制转换成int类型,已经不是指针了,因此+1就是存粹往a上加个1。

        在内存中a[4]的存放是如上图的,强制类型转换后+1指向的其实是如上图的位置,那么再对其进行解引用得到的就是02000000(因为我们用的编译器是小端存储,数据的低位是放在地址的低位的,存储时反着存,读取时要反着读取)

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

4.1 答案

        

        答案是1,是不是没想到

4.2 解析

        其实这题在初始化是有坑的,仔细看我们在初始化的时候用到了(),我举个例子:

(0,1)这个式子其实就是1,这是个逗号表达式,逗号表达式的值就是最后一个','后面的那个值,在这里就是1.其实a[3][2]这个数组只初始话了3个值{1 , 3 , 5}。

        好了,现在再来分析p指针,对于p来讲,p=a[0],将a第一行赋值给p其实就是第一行元素的首地址给了p,最后打印时p[0]其实就是访问a第一行第一个元素的值,相当于a[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;
}

5.1 答案

答案是:FFFFFFFC,-4

5.2 解析

        这题,p是一个数组指针,其步长为4个整型数据大小,比a数组的每一行长度少1个整型数据大小,p和a一开始指向的是同一个地址,每当p+1时,p只能跳过4个整型数据大小的地址,而对于a来说,a+1可以跳过5个整型数组的大小的地址。所以,p[4][2]和a[4][2]比较,它们都跳过了4行,因此a[4][2]在地址上比p[4][2]多4个整型大小的值,而我们知道,指针和指针相减,得到的是两个指针之间的元素个数,因此是-4,%p是输出地址,其没有原码反码补码的概念,直接将内存中-4的补码输出,就是FFFFFFFC。

总结

        本篇通过五个例子来加强我们对指针和数据存储的理解,希望对你学习c语言的指针有所帮助!

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

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

相关文章

Google重磅开源!Gemma 2B/7B小模型登场,6万亿Tokens喂饱,聊天编程两不误,LLaMA也黯然失色?

Google又有大动作&#xff01; 近日&#xff0c;他们发布了Gemma 2B和7B两个开源AI模型&#xff0c;与大型封闭模型不同&#xff0c;它们更适合小型任务&#xff0c;如聊天和文本摘要。 这两个模型在训练过程中使用了6万亿个Tokens的数据&#xff0c;包括网页文档、代码和数学…

收单外包机构备案2023年回顾和2024年展望

孟凡富 本文原标题为聚合支付深度复盘与展望&#xff0c;首发于《支付百科》公众号&#xff01; 收单外包服务机构在我国支付收单市场中占据着举足轻重的地位&#xff0c;其规模在政策引导和市场需求驱动下不断扩大。同时&#xff0c;随着行业自律管理体系的持续发展和完善&a…

文献速递:GAN医学影像合成--用生成对抗网络生成 3D TOF-MRA 体积和分割标签

文献速递&#xff1a;GAN医学影像合成–用生成对抗网络生成 3D TOF-MRA 体积和分割标签 01 文献速递介绍 深度学习算法在自然图像分析中的成功近年来已被应用于医学成像领域。深度学习方法已被用于自动化各种耗时的手动任务&#xff0c;如医学图像的分割和分类&#xff08;G…

顶刊中很出彩的二元变量图

导师希望你发顶刊, 但你的图纸差点意思, 那么,你不妨试试这个, 二元变量图, 在顶刊中都很出彩哦! 本次,我们来以“降水量”和“NDVI”两个数据为例,绘制二元变量分析图,表达“降水量”和“NDVI”之间的关系。 什么是二元变量图 首先还是先解释下“二元变量图”。顾…

扫盲贴:Svg动画和Canvas动画有什么区别

hello&#xff0c;我是贝格前端工场&#xff0c;网页中动画的实现有N种方式&#xff0c;比如css动画&#xff0c;js动画&#xff0c;svg动画&#xff0c;canvas动画等等&#xff0c;每一种动画都有对应的场景&#xff0c;本问重点介绍一下svg和canvas动画的异同点&#xff0c;欢…

大工程 从0到1 数据治理 数仓篇(sample database classicmodels _No.7)

大工程 从0到1 数据治理 之数仓篇 我这里还是sample database classicmodels为案列&#xff0c;可以下载&#xff0c;我看 网上还没有类似的 案列&#xff0c;那就 从 0-1开始吧&#xff01; 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参…

TRS 2024 论文阅读 | 基于点云处理和点Transformer网络的人体活动连续识别

无线感知/雷达成像部分最新工作<持续更新>: 链接地址 注1:本文系“无线感知论文速递”系列之一,致力于简洁清晰完整地介绍、解读无线感知领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; MobiCom, Sigcom, MobiSys, NSDI, SenSys, Ubicomp; JSAC, 雷达学…

提高代码质量的 10 条编码原则

提高代码质量的 10 条编码原则 本文转自 公众号 ByteByteGo&#xff0c;如有侵权&#xff0c;请联系&#xff0c;立即删除 今天来聊聊提高代码质量的 10 条编码原则。 软件开发需要良好的系统设计和编码标准。我们在下图中列出了 10 条良好的编码原则。 01 遵循代码规范 我们…

Studio One破解版和正版的区别 Studio One购买是永久的吗

在过去的很长一段时间里&#xff0c;很多小伙伴想要使用一款软件时&#xff0c;可能第一时间就去网上寻找破解版的资源&#xff0c; 白嫖的资源固然很香&#xff0c;但随着法制的健全和人们版权意识的增强&#xff0c;现在破解版的资源是越来越少了。同时破解版的资源也会伴随着…

大数据计算技术秘史(上篇)

在之前的文章《2024 年&#xff0c;一个大数据从业者决定……》《存储技术背后的那些事儿》中&#xff0c;我们粗略地回顾了大数据领域的存储技术。在解决了「数据怎么存」之后&#xff0c;下一步就是解决「数据怎么用」的问题。 其实在大数据技术兴起之前&#xff0c;对于用户…

java面试JVM虚拟机篇

1 JVM组成 1.1 JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f; 难易程度&#xff1a;☆☆☆ 出现频率&#xff1a;☆☆☆☆ JVM是什么 Java Virtual Machine Java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 好处&#xff1a; 一次编写&a…

Excel之index、MATCH面试题、VLOOKUP函数,

VLOOKUP() 在表格的首列查找指定的数值&#xff0c;并返回表格当前行中指定列处的数值。 结构&#xff1a;VLOOKUP(查找值,查找区域,列序数,匹配条件) 解释&#xff1a;VLOOKUP(找谁,在哪里找,第几列,0或1) 1.目的&#xff1a;根据【产品】查找【销量】 公式&#xff1a;V…

pikachu靶场-XSS

XSS&#xff1a; XSS&#xff08;跨站脚本&#xff09;概述 Cross-Site Scripting 简称为“CSS”&#xff0c;为避免与前端叠成样式表的缩写"CSS"冲突&#xff0c;故又称XSS。一般XSS可以分为如下几种常见类型&#xff1a; 1.反射性XSS; 2.存储型XSS; 3.DOM型XSS; …

QT的UI入门

二、UI入门 QWidget类&#xff08;熟悉&#xff09; QWidget类是所有组件和窗口的基类&#xff0c;内部包含了一些基础的界面特性。 常用属性&#xff1a; 修改坐标 x : const int 横坐标&#xff0c;每个图形的左上角为定位点&#xff0c;横轴的零点在屏幕的最左边&#xff0c…

171基于matlab的随机共振微弱信号检测

基于matlab的随机共振微弱信号检测&#xff0c;随机共振描述了过阻尼布朗粒子受周期性信号和随机噪声的共同作用下,在非线性双稳态系统中所发生的跃迁现象. 随机共振可用于弱信号的检测。程序已调通&#xff0c;可直接运行。

HashMap 源码学习-jdk1.8

1、一些常量的定义 这里针对MIN_TREEIFY_CAPACITY 这个值进行解释一下。 java8里面&#xff0c;HashMap 的数据结构是数组 &#xff08;链表或者红黑树&#xff09;&#xff0c;每个数组节点下可能会存在链表和红黑树之间的转换&#xff0c;当同一个索引下面的节点超过8个时…

【Webpack】处理字体图标和音视频资源

处理字体图标资源 1. 下载字体图标文件 打开阿里巴巴矢量图标库open in new window选择想要的图标添加到购物车&#xff0c;统一下载到本地 2. 添加字体图标资源 src/fonts/iconfont.ttf src/fonts/iconfont.woff src/fonts/iconfont.woff2 src/css/iconfont.css 注意字体…

[计算机网络]---TCP协议

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一 、TCP协…

Java并发基础:原子类之AtomicBoolean全面解析

本文概要 AtomicBoolean类优点在于能够确保布尔值在多线程环境下的原子性操作&#xff0c;避免了繁琐的同步措施&#xff0c;它提供了高效的非阻塞算法实现&#xff0c;可以大大提成程序的并发性能&#xff0c;AtomicBoolean的API设计非常简单易用。 AtomicBoolean核心概念 …

Facebook Horizon:探索虚拟现实中的社交空间

随着科技的不断进步&#xff0c;虚拟现实&#xff08;VR&#xff09;技术正成为社交互动和娱乐体验的新前沿。在这个数字时代&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;正在引领虚拟社交的新时代&#xff0c;其推出的虚拟社交平台Facebook Horizon成为了…