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

news2024/11/26 3:36:30

目录

回顾上篇重点 :

一.笔试题 ( 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.coloradmin.cn/o/1023843.html

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

相关文章

Word中的图片保存后变模糊怎么解决

目录 1.介绍 2.原因 3.解决方案 Word是由微软公司开发的一款文字处理软件&#xff0c;它是Microsoft Office套件的一部分。Word提供了丰富的功能和工具&#xff0c;使用户能够创建、编辑和格式化文档。它支持各种文本处理任务&#xff0c;包括编写信函、报告、论文、简历等。…

C# Onnx Yolov8 Detect Poker 扑克牌识别

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System…

OVS-DPDK学习

安装教程&#xff1a; https://docs.openvswitch.org/en/latest/intro/install/dpdk/ https://docs.openvswitch.org/en/latest/howto/dpdk/ overview和应用 https://www.intel.com/content/www/us/en/developer/articles/technical/open-vswitch-with-dpdk-overview.html OVS…

【网络安全】黑客自学笔记

1️⃣前言 &#x1f680;作为一个合格的网络安全工程师&#xff0c;应该做到攻守兼备&#xff0c;毕竟知己知彼&#xff0c;才能百战百胜。 计算机各领域的知识水平决定你渗透水平的上限&#x1f680; 【1】比如&#xff1a;你编程水平高&#xff0c;那你在代码审计的时候就会比…

【Map篇】HashTable详解

目录 成员变量属性构造函数put()remove()get()总结: HashTable的优点?HashTable 是一种基于哈希函数的数据结构。它将每个键Key映射到一个唯一的索引Index,通过这个索引来快速访问数据。底层是一个数组,数组中的每个元素称为桶(bucket)。 当我们需要访问某个元素时,首先会对…

Python 网络爬取的时候使用那种框架

尽管现代的网站多采取前后端分离的方式进行开发了&#xff0c;但是对直接 API 的调用我们通常会有 token 的限制和可以调用频率的限制。 因此&#xff0c;在一些特定的网站上&#xff0c;我们可能还是需要使用网络爬虫的方式获得已经返回的 JSON 数据结构&#xff0c;甚至是处理…

[架构之路-218]- 架构师责权利的定位, 架构师是技术领导者、决策者、激励者、企业家思维、战略思维、理论指导

目录 一、架构的诉求与系统的规模和复杂度强相关 1.1 系统的规模和复杂度对架构的影响 1.2 系统的业务需求对架构的影响 1.3 业架构和软件架构 二、架构师的类型 三、系统架构师 3.1 什么是系统架构师 3.2 系统架构师的技术素质要求 3.3 系统架构师的管理素质要求 3.…

【小程序】九宫格抽奖,页面不是有点丑,功能没啥问题,有需要直接拿去改吧

概述 常用活动抽奖功能&#xff0c;九宫格抽奖&#xff0c;两种方式切换&#xff0c;图片模式和文字模式&#xff0c;带抽奖次数。功能没啥问题&#xff0c;除了有点丑&#xff0c;css样式自己美化一下就可以了... 详细 微信小程序大转盘抽奖 演示图文字&#xff1a; 演示图…

Redis延迟双删-架构案例2021(三十二)

数据库设计 某医药销售企业因业务发展&#xff0c;需要建立线上药品销售系统&#xff0c;为用户提供便捷的互联网药品销售服务、该系统除了常规药品展示、订单、用户交流与反馈功能外&#xff0c;还需要提供当前热销产品排名、评价分类管理等功能。 通过对需求的分析&#xf…

JVM G1垃圾回收器学习笔记

前言 最近在工作中遇到频繁FullGC且YoungGC时间有时特别长的情况&#xff0c;而自己对JVM的垃圾回收也是一知半解&#xff0c;因此需要对JVM做系统的了解&#xff0c;为快速解决工作中的问题&#xff0c;能有效分析GC日志和业务代码&#xff0c;先从G1垃圾回收器开始学习&…

【论文阅读】检索增强发展历程及相关文章总结

文章目录 前言Knn-LMInsightMethodResultsDomain AdaptionTuning Nearest Neighbor Search Analysis REALMInsightsMethodKnowledge RetrieverKnowledge-Augmented Encoder ExpResultAblation StudyCase Study DPRInsightMethodExperimentsResults RAGInsightRAG-Sequence Mode…

小程序中如何查看会员的访问记录

​在小程序中&#xff0c;我们可以通过如下方式来查看会员的访问记录。下面是具体的操作流程&#xff1a; 1. 找到指定的会员卡。在管理员后台->会员管理处&#xff0c;找到需要查看访客记录的会员卡。也支持对会员卡按卡号、手机号和等级进行搜索。 2. 查看会员卡详情。点…

RK3588平台开发系列讲解(项目篇)视频监控之RTMP推流

文章目录 一、RTMP协议是什么二、RTMP 的原理三、Nginx 流媒体服务器四、FFmpeg 推流沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 目前常见的视频监控和视频直播都是使用了 RTMP、RTSP、HLS、MPEG-DASH、WebRTC流媒体传输协议等。 视频监控项目组成,分为三部分:…

PHP-composer安装扩展安装,批量操作合并pdf

清除Composer缓存&#xff1a; 运行以下命令来清除Composer的缓存&#xff0c;并再次尝试安装包。 bash composer clear-cache 使用不同的镜像源&#xff1a; Composer使用的默认包源可能会受到限制或访问问题。你可以切换到使用其他镜像源&#xff0c;如阿里云、Composer中国…

uni-app:实现等待加载功能

例子 下例是实现蓝牙连接的部分代码&#xff0c;先进行加载连接显示&#xff0c;在进行连接&#xff0c;连接成功/失败&#xff0c;都自动关闭加载效果 效果 核心 开始的加载效果&#xff1a; uni.showLoading({title: 正在连接&#xff0c;请稍候...,mask: true, }); 关闭…

进程转态及其转换过程

一.进程转态及其转换过程 在 Linux 操作系统中&#xff0c;进程的状态可以相互转换&#xff0c;下面是不同状态之间的相互转换&#xff1a; 就绪态&#xff08;Ready State&#xff09;&#xff1a;当一个进程创建后&#xff0c;它被放入就绪态。此时&#xff0c;进程已经被加…

Docker Compose初使用

简介 Docker-Compose项目是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层&#xff0c;分别是 工程&#xff08;project&#xff09;&#xff0c;服务&#xff08;service&#xff09;以及容器&#xff08;cont…

密码学概论

1.密码学的三大历史阶段&#xff1a; 第一阶段 古典密码学 依赖设备&#xff0c;主要特点 数据安全基于算法的保密&#xff0c;算法不公开&#xff0c;只要破译算法 密文就会被破解&#xff0c; 在1883年第一次提出 加密算法应该基于算法公开 不影响密文和秘钥的安全&#xff…

《Kubernetes部署篇:Ubuntu20.04基于外部etcd+部署kubernetes1.25.14集群(多主多从)》

一、部署架构图 1、架构图如下所示: 2、部署流程图如下所示: 二、环境信息 1、资源下载基于外部etcd+部署容器版kubernetes1.25.14集群资源合集 2、部署规划主机名K8S版本系统版本内核版本IP地址备注k8s-master-121.25.14Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.12ma…

【音视频】AAC音频压缩格式

AAC音频压缩格式 ADTSvsADIF 总结&#xff1a; ADTS可以在任意帧解码&#xff0c;也就是说它每一顿都有头信息【默认使用格式】 ADIF只有一个统一的头&#xff0c;所以必须得到所有的数据后解码【一般不使用】 每一帧结构 每一帧的ADTS的头文件都包含了音频的采样率&#x…