指针笔试题讲解-----让指针简单易懂(2)

目录

回顾上篇重点 :

一.笔试题 ( 1 ) 

二.笔试题 ( 2 )

科普进制知识点

(1) 二进制

(2) 八进制

(3)十六进制

三.笔试题( 3 )

四.笔试题( 4 )

五.笔试题( 5 )

六.笔试题( 6 )


回顾上篇重点 :

数组名的理解 :   数组名就是首元素地址                                                                                

 但是有两个例外:      

1. sizeof(数组名)这里的数组名表示整个数组的大小,sizeof(数组名)计算的是整个数组的大小,单位是字节                                                                                                              

2. &数组名   这里的数组名表示整个数组 ,&数组名取出的是数组的地址


指针变量的大小和类型无关,不管什么类型的指针变量,大小都是4/8个字节
指针变量是用来存放地址的,地址存放需要多大空间,指针变量的大小就是几个字节
32位环境下,地址是32个二进制位,需要4个字节,所以指针变量的大小就是4个字节
64位环境下,地址是64个二进制位,需要8个字节,所以指针变量的大小就是8个字节 


strlen函数,只有遇到 ' \0 ' 时才停止  

sizeof ()是C语言中常用的运算符,可以计算操作数的大小

博主个人建议 : 自己先做一遍,看看哪个做错了,然后再看博主的解释

                          做对的题,自己想想因为什么得这个数,看看与博主的解释一样不

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

   

由上期重点可知:&数组名 , 这里的数组名表示整个数组 ,&数组名取出的是数组的地址

 ptr = &a+1 ,ptr - 1在4和5之间所以*(ptr-1)是 5 ;

*(a+1) ,单独的数组名表示整个数组的大小,除此之外都是首元素地址,所以(a + 1)是首元素地址 + 1 也就是 2

二.笔试题 ( 2 )

//由于还没学习结构体,这里告知结构体的大小是20个字节
//X86 环境下演示
struct Test
{int Num;char* pcName;short sDate;char cha[2];short sBa[4];
} * p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
//0x开头的数字是16进制的数字
int main()
{p = (struct Test*)0x100000;printf("%p\n", p + 0x1);printf("%p\n", (unsigned long)p + 0x1);printf("%p\n", (unsigned int*)p + 0x1);return 0;
}

注意 :笔试题全套多到防不胜防,看到结果后,请问多少人掉进沟里了

这是一个结构体指针,在 x86 环境下它为20个字节

指针在进行加减法运算时,会跳过其所对应的字节数;例如int* a;在它进行+1后会跳过4个字节

题目中0x是表示十六进制............题目中 p 是一个20个字节的结构体指针,p+1也就是跳过20个字节也就是 0x100000+20(转换成十六进制是+14)所以最后结果为0x100014,关于进制转换不懂的可以看下面的进制的知识点科普

unsigned是类型强制转换,有多少人认为第二个printf输出的0x100004呢,掉进沟里了吧 

此时的p不是指针,而是一个无符号长整型变量,+1只是加了一个字节,打印出来是0x100001

第三个printf,强制转换成了无符号整形指针,+1后其实是跳过了4个字节,打印出来是0x100004

科普进制知识点


(1) 二进制

二进制由 0 和 1 两个数字组成,使用时必须以0b或0B(不区分大小写)开头

例如: 0000 00011 十进制为 3   1*1+1*2

         0000 00101 十进制为 5   1*1+1*4

(2) 八进制

八进制由 0~7 八个数字组成,使用时必须以0开头(注意是数字 0,不是字母 o)

例如:015                 十进制为 13       1*8+5*1

         -0101               十进制为 -65    -(1*64+1*1) 

(3)十六进制


十六进制由数字 0~9、字母 A~F 或 a~f(不区分大小写)组成,使用时必须以0x或0X(不区分大小写)开头

例如:  0X2A;              十进制为 42      2*16+10 

         -0XA0               十进制为 -160  -(10*16+0)

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

注意 : %x是以十六进制的形式输出整数

ptr1 = &a + 1

第一个printf,这个是强制转换为 int* 形式,ptr1所在的位置是ptr [-1] ,以十六进制打印的话就是4

第二个printf  用到了数据在内存中的存储,如下

大端:是数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。低地址-->>高数据   例如:手机

 小端:是指数据的地位保存在内存的低地址中,数据的高位则保存在内存的高地址中。低地址-->>低数据    例如:电脑

a是数组首元素的地址,但是题目中强制转化成了int(整形变量),+1跳过了一个字节所以如上面图2把01跳了过去,上面解释了小端的存储形式,低地址就是低数据所以打印出来应该是20000000

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

注意:这个也是有坑的 ,二维数组里面定义的方式是小括号!!!!!

传递后面的数字,所以p[0]的值是1

打印的结果就是1

正确的是这么画的

五.笔试题( 5 )

int main()
{int a[5][5];int(*p)[4];//数组指针p = a;//类型合适吗?   //a - int(*)[5]//p - int(*)[4]printf("%p, %d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);////%p是打印地址,认为内存中存储的补码就是地址//return 0;
}

 

题目中说了a 一个五行五列的数组,*p是一个行省略四列的数组,,如上图, &p[4][2] - &a[4][2]他们两个相减等于-4,所以%d的值为-4,由于-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;
}

 

*(ptr1-1)也就是*(&aa+1-1)最后结果是10

*(ptr2-1)也就是(*(aa+1)-1最后结果是5 

 

还有两道笔试题,在更新下一章的时候补充,记得点个关注,要不然容易找不到!!!!

下一章更新字符串函数,敬请期待

如果有解释的不对或者不清晰,麻烦大佬们海涵,如果可以烦请从评论区指出,我一定会加以修改,万分感谢

最后麻烦大佬们动一下发财的小手一键三连,万分感谢

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

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

相关文章

在比特币上使用可检索性证明支付存储费用

我们为用户开发了一种为云存储付费的新方法。 与亚马逊的 S3 等传统云存储相比&#xff0c;用户不必信任服务器。 我们使用比特币智能合约来确保支付取决于服务器的可检索性证明 (PoR)&#xff0c;该证明只能在数据仍然可用且需要时可以检索的情况下生成。 可检索性证明 (PoR)…

Java基础(一)——Hello World,8种数据类型,键盘录入

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

FPGA — Vivado下ILA(逻辑分析仪)详细使用方法

使用软件&#xff1a; Vivado 开发板&#xff1a; EGO1采用Xilinx Artix-7系列XC7A35T-1CSG324C FPGA 使用程序&#xff1a;按键案例 ILA详细使用方法 一、ILA简介二、ILA的使用方法方法1 — 使用IP核创建ILA调试环境创建ILA IP核 方法二 — 使用 Debug 标记创建 ILA对需观察信…

中国核动力研究设计院使用 DolphinDB 替换 MySQL 实时监控仪表

随着仪表测点的大幅增多和采样频率的增加&#xff0c;中国核动力研究设计院仪控团队原本基于 MySQL 搭建的旧系统已经无法满足大量数据并发写入、实时查询和聚合计算的需求。他们在研究 DB-Engines 时序数据库榜单时了解到国内排名第一的 DolphinDB。经过测试&#xff0c;发现其…

【C++面向对象侯捷】8.栈,堆和内存管理

文章目录 栈&#xff0c;堆stack object的生命周期static local object的生命周期global object的生命周期heap objects 的生命期new&#xff1a;先分配memory&#xff0c;再调用构造函数delete: 先调用析构函数&#xff0c;再释放 memory动态分配所得的内存块&#xff0c;in V…

Vue系列(三)之 基础语法下篇【事件处理,表单综合案例,组件通信】

一. 事件处理 在 Vue.js 中&#xff0c;v-on 指令被用于监听 DOM 事件&#xff0c;并在事件触发时执行相应的方法&#xff0c;这些方法就是事件处理器。v-on 指令有简写形式 &#xff0c;例如 click"handleClick" 会监听点击事件并执行 handleClick 方法。 事件处理…

CentOS 7 安装Libevent

CentOS 7 安装Libevent 1.下载安装包 新版本是libevent-2.1.12-stable.tar.gz。&#xff08;如果你的系统已经安装了libevent&#xff0c;可以不用安装&#xff09; 官网&#xff1a;http://www.monkey.org/~provos/libevent/ 2.创建目录 # mkdir libevent-stable 3.解压 …

pdf文件可以压缩大小吗?pdf压缩方法分享

在日常生活和工作中&#xff0c;我们经常需要处理大量的PDF文件。有时候&#xff0c;一个PDF文件的大小可能超过了几十MB&#xff0c;甚至无法通过电子邮件发送。那么&#xff0c;如何有效地压缩PDF文件大小呢&#xff1f;本文将为你介绍三个简单易行的方法&#xff0c;帮助你轻…

RabbitMQ工作模式——Topics模式

1.Topics通配符模式 *是一个单词&#xff0c;#是0到多个单词 Topics模式生产者代码 public class Producer_Topic {public static void main(String[] args) throws IOException, TimeoutException {//1.创建连接工厂ConnectionFactory factory new ConnectionFactory();//…

FreeRTOS 任务创建分析

FreeRTOS 任务创建分析 Fang XS.1452512966qq.com如果有错误&#xff0c;希望被指出&#xff0c;学习技术的路难免会磕磕绊绊 FreeRTOS FreeRTOS快速上手教程FreeRTOS之任务优先级设置TCB 即任务控制块。FreeRTOS中使用TCB来进行任务管理&#xff0c;用来储存任务状态&#…

【C语言】指针笔试题解析

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解指针和数组笔试题解析&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 1. 下面程序的结果是什么&#xff1f; int main() {int a[5] { 1, 2, 3, 4, 5 };i…

Nginx负载均衡详解

一、负载均衡介绍 1、负载均衡的定义 单体服务器解决不了并发量大的请求&#xff0c;所以&#xff0c;我们可以横向增加服务器的数量&#xff08;集群&#xff09;&#xff0c;然后将请求分发到各个服务器上&#xff0c;将原先请求集中到单个服务器上的情况改为将请求分发到多…

React useRequest解读

源码结构&#xff1a; 可以看到虽然是一个hooks&#xff08;具有一定功能且具备状态的单一函数&#xff09; 但是各种文件功能分得也是很细的&#xff0c;方便抽离和复用 useRequest.ts 抽离的原则还是单一功能原则 可以看出 真正的hooks实现是在Implement里 对于类型type的引…

【前端面试题】浏览器面试题

文章目录 前言一、浏览器面试问题1.cookie sessionStorage localStorage 区别2.如何写一个会过期的localStorage&#xff0c;说说想法2.如何定时删除localstorage数据2.localStorage 能跨域吗2.memory cache 如何开启2.localstorage的限制2.浏览器输入URL发生了什么2.浏览器如何…

孙哥Spring源码第25集

第25集、处理代理中获取代理进行方法调用 0、问题所在 1、实现ApplicationContextAware接口实现代理 它的处理是在ApplicationContextAware中处理的 2、ExposeProxy分析 整体 分析 如何设置成了false就会有下面的问题 3、使用EnableAspectJAutoProxy解决代理问题 4、到底如何…

WEB使用VUE3实现地图导航跳转

我们在用手机查看网页时可以通过传入经纬度去设置目的地然后跳转到对应的地图导航软件&#xff0c;如果没有下载软件则会跳转到下载界面 注意&#xff1a; 高德地图是一定会跳转到一个新网页然后去询问用户是否需要打开软件百度和腾讯地图是直接调用软件的这个方法有缺陷&…

JavaScript中的代理对象(proxy)

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 创建代理对象⭐ 使用代理对象⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友…

【车载开发系列】ECU Application Software程序刷新步骤

【车载开发系列】ECU Application Software程序刷新步骤 ECU Application Software程序刷新步骤 【车载开发系列】ECU Application Software程序刷新步骤一. Boot Software&#xff08;引导软件&#xff09;1&#xff09;boot manager&#xff08;启动管理器&#xff09;2&…

ElasticSearch(二)

1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0c;…

挂件板死机刷固件

用ESP32-DevKitC_V4刷固件的工具flash_download_tool_3.9.5.exe 挂件板子端口接线依次为V&#xff08;接3V3&#xff09;、R&#xff08;接TXD&#xff09;、T&#xff08;接RXD&#xff09;、G&#xff08;接GND&#xff09;、L&#xff08;悬空&#xff09; 1.选择ESP8266&…