数组和指针笔试题解析之【指针】

news2025/2/27 1:52:41

目录

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

运行结果: 

🎈解析: 

1.a是数组首元素的地址,+1得到第二个元素的地址,对其解引用得到的就是2;

2.&a取出整个数组的地址,+1跳过整个数组,对跳过的整个数组-1,得到的就是数组最后一位元素的地址,对其解引用的结果就是5


🍂笔试题2:

//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p;

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

运行结果: 

🎈解析: 

 1.已知结构体变量的大小是20个字节,因为p是结构体指针类型,所以+1就是跳过20个字节,又因为十进制的20 等价于16进制的14,所以打印出来的结果为00100014

2.这里将其强制类型转换成unsigned long,表示整数,整数+1就是+1,所以打印出来的结果为00100001

3.这里将其强制类型转换成unsigned int*,表示整型指针,+1就是向后跳过4个字节,所以打印出来的结果为00100004


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

运行结果: 

🎈解析:

1.&a取出的是整个数组的地址,+1就跳过整个数组,ptr1[-1] == *(ptr1-1),得到的就是下标为3的元素4

2.这里的a为数组名,即数组首元素的地址,强制类型转换为整型,+1就是加上数值1,即1个字节,ptr2就指向了第一个元素第二个字节处,对其解引用操作,访问4个字节的位置,因为数组在内存中是连续存储的,且是小端存储,即02 00 00 00,所以将其以%x的形式打印就为2000000


🍂笔试题4:

int main()
{
int a[3][2] = { (0, 1), (2, 3), (4, 5) };
int *p;
p = a[0];
printf( "%d", p[0]);
return 0;
}

 运行结果: 

🎈解析:

 做这道题的时候我们一定要擦亮眼睛,注意这个二维数组初始化的时候里边写的是逗号表达式,而不是{ }。逗号表达式的运算法则是从左向右计算,最后一个表达式的结果为整个逗号表达式的结果,所以数组初始化的元素为{1,3,5},其余的元素均为0。a[0] == a[0][0],a[0]是第一行的数组名,数组名是数组首元素的地址,即元素1的地址,把它存放在指针变量p当中去,p[0] == *(p+0) == *p,即对p进行解引用操作,打印出来就为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;
}

  运行结果: 

🎈解析:

 1.a为数组首元素的地址,即第一行的地址,它的类型是int (*) [5],p的类型是int (*) [4],虽然它们的类型不同,但并不影响将a的地址放在p里边去。

2.观察上图,我们可以看见&p[4][2]和&a[4][2]在内存中所指向的位置,这两者都是指针,指针减去指针得到的是中间元素的个数,因为随着数组下标的增长地址是由低到高变化的,所以%d打印的结果就为-4。%p打印的是地址,认为内存中存储的补码就是地址,所以结果为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;
}

   运行结果:

🎈解析:

1. &aa取出的是整个二维数组的地址,&aa+1跳过一个二维数组的大小,强制类型转换成int*类型,ptr1此时也指向了这个位置,所以*(ptr-1)打印的结果就为10

2.aa是数组名,表示数组首元素的地址,即第一行的地址,+1跳过一个int [5]的大小,指向第二行,对其进行解引用操作,此时,ptr2指向了6,*(ptr2-1)打印的结果就为5


🍂笔试题7:

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

    运行结果:

 🎈解析:

这里给出了一个名为a的指针数组,每个数组的类型是char*类型,实际存放的并不是"work","at","alibaba",而是字符串首元素的地址,第一个char*指向了'w'的地址,第二个char*指向了'a'的地址,第三个char*指向了'a'的地址;数组名a是数组首元素的地址,char*的地址为char**类型,存放到pa这个二级指针中,pa++就跳过了一个char*的类型,*pa就拿到了数组第二个元素,即'a'的地址,%s打印就为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;
}

 运行结果:

 

 🎈解析:

 1.**++cpp,程序首先会执行++cpp操作,cpp会跳过一个char**的类型,此时就指向了c+2,对其解引用操作,我们拿到了c+2的这块空间里面的数据,即c+2,而c+2又是c数组下标为2的元素空间的地址,对其进行解引用操作,就拿到了c数组下标为2的空间,这块空间存放了‘P’的地址,%s就会根据P的地址向后打印字符串,打印的结果就是POINT

2. *-- * ++cpp + 3,按优先级来算,先从++cpp开始计算,此时的cpp不再指向c+2,而是指向了c+1,然后进行解引用操作,就拿到了c+1这块空间里面的数据,在进行--操作,相当于c+1减去1,那么这块空间的数据就是c了,在对其进行解引用操作,它就指向了c数组的第一个元素,即'E'的地址,最后+3,此时指针指向第二个'E',%s就会根据此时的地址向后打印字符串,结果就是ER 

3. *cpp[-2] + 3 ,cpp[-2]可以看作是*(cpp - 2),即 **(cpp - 2)+ 3 ,cpp - 2指向了cp数组的第一个元素的空间,解引用操作,拿到了c+3这块空间,这块空间指向了c数组的下标为3的元素空间,解引用操作,拿到了这块空间,即'F'的地址,最后+3,指针指向了'S',%s就会根据此时的地址向后打印字符串,结果打印就是ST 

4. cpp[-1][-1] + 1,cpp[-1][-1] 可以看作是*(*(cpp - 1) - 1) ,即 *(*(cpp - 1) - 1)+1,cpp - 1指向了cp数组的第二个元素的空间,解引用操作,拿到了c+2这块空间, - 1即c+2减去1,那么这块空间的数据就是c+1了,此时指向了c数组的第二个元素,解引用操作,拿到了这块空间的元素, 即'N'的地址,最后+1,指针指向了'E',%s就会根据此时的地址向后打印字符串,结果就是EW 

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

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

相关文章

实施主品牌进化战略(一):确立主品牌进化架构

主品牌进化战略,即以主品牌为核心创造、巩固、转化竞争优势应对竞争环境变化,避免衰退,回归增长,让主品牌进化的方法论体系。主品牌进化战略制定要从 4 个方面出发:确立主品牌进化架构、更新和明确主品牌竞争方向、建立…

Java高级-注解

注解 1.介绍2.元注解3.注解的解析4.注解的应用场景 1.介绍 注解 Annotation 就是Java代码里的特殊标记,作用是让其他程序根据注解信息来决定什么是执行该程序注解:注解可以在类上、构造器上、方法上、成员变量上、参数上等位置 自定义注解 /*** 自定…

【产品经理】深入B端SaaS产品设计核心理念

这几年各企业的B端业务都在做SaaS平台,但对SaaS的了解还不是完全全面,对于一些产品的定位以及设计还在探索中 本文讨论“为什么采用SaaS模式”、“SaaS产品有哪些”以及“如何做好SaaS产品设计”三个话题,核心是产品设计,主要从需…

Qt5开发及实例V2.0-第九章-Qt文件及磁盘处理

Qt5开发及实例V2.0-第九章-Qt文件及磁盘处理 第9章 Qt 5文件及磁盘处理9.1 读写文本文件9.1.1 QFile类读写文本9.1.2 QTextStream类读写文本 9.2 读写二进制文件9.3 目录操作与文件系统9.3.1 文件大小及路径获取实例9.3.2 文件系统浏览 9.4 获取文件信息9.5 监视文件和目录变化…

由于数字化转型对集成和扩展性的要求,定制化需求难以满足,百数低代码服务商该如何破局?

当政策、技术环境的日益成熟,数字化转型逐步成为企业发展的必选项,企业数字化转型不再是一道选择题,而是决定其生存发展的必由之路。通过数字化转型升级生产方式、管理模式和组织形式,激发内生动力,成为企业顺应时代变…

Nacos服务列表有服务,但是配置列表不起作用。

目录 bug现场解决思路POM文件启动日志排查完整pom文件nacos配置中心部署流程 想要重新再写一下springcloud alibaba 的组件配置,再另一个服务renren-product引入,nacos的注册发现和配置中心。前面都很顺利但是修改配置中心配置的时候不起作用&#xff01…

Spring Boot实现对超大文件进行异步压缩下载

在Web应用中,文件下载功能是一个常见的需求,特别是当你需要提供用户下载各种类型的文件时。本文将演示如何使用Spring Boot框架来实现一个简单而强大的文件下载功能。我们将创建一个RESTful API,通过该API,用户可以下载问价为ZIP压…

linux下CentOS安装mysql-5.7

linux下安装mysql只需要在root用户下安装,普通用户也能使用 1.检查: 通过以下两条命令查看改系统下是否已存在mysql。 ps ajx | grep mysql ps ajx | grep mariadb通过指令如果只显示如下两条信息,则当前系统下不存在MySQL。 就可以直接进…

蓝牙电话之HFP—电话音频

1 媒体音频: 播放蓝牙音乐的数据,这种音频对质量要求高,数据发送有重传机制,从而以l2cap的数据形式走ACL链路。编码方式有:SBC、AAC、APTX、APTX_HD、LDAC这五种编码方式,最基础的编码方式是SBC&#xff0…

手撕二叉树

前序遍历构建二叉树 二叉树的销毁 二叉树的结点个数 二叉树叶子节点个数 二叉树第k层节点个数 二叉树查找值为x的节点 二叉树前序遍历 二叉树中序遍历 二叉树后序遍历 二叉树的层序遍历 判断二叉树是否是完全二叉树 完整代码 test.c #define _CRT_SECURE_NO_WARNINGS 1#incl…

网络防御--防火墙

拓扑 Cloud 1 作为电脑与ENSP的桥梁 防火墙配置 登录防火墙 配置IP地址及安全区域 添加地址对象 配置策略 1、内网可以访问服务器 结果 2、内网可以访问公网 结果 配置NAT策略 结果

注入之SQLMAP(工具注入)

i sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL和SQL注入漏洞,其广泛的功能和选项包括数据库指纹,枚举,数据库提权,访问目标文件系统,并在获取操作权限时执行任…

【Java 基础篇】Java多线程编程详解:线程创建、同步、线程池与性能优化

Java是一门强大的编程语言,其中最引人注目的特性之一是多线程支持。多线程允许我们在同一程序中同时执行多个任务,这大大提高了应用程序的性能和响应能力。本文将深入介绍Java线程的基础知识,无论您是初学者还是有一些经验的开发人员&#xf…

Qt5开发及实例V2.0-第八章-Qt模型/视图结构

Qt5开发及实例V2.0-第八章-Qt模型/视图结构 第8章 Qt 5模型/视图结构8.1 概述8.1.1 基本概念8.1.2 【实例】:模型/视图类使用 8.2 模型(Model)8.3 视图(View)8.4 代理(Delegate) 本章相关例程源…

2023.9.19 关于 数据链路层 和 DNS 协议 基本知识

目录 数据链路层 MTU DNS 协议 补充 DHCP协议 数据链路层 基本概念: 考虑相邻两个节点之间的传输(通过 网线 / 光纤 / 无线 直接相连的两个设备)以太网协议 规定了 数据链路层 和 物理层 的内容 IP地址 与 mac地址 的相互配合 IP地址 描…

ardupilot的编译过程

环境 树莓派4b ubuntu20.04 git 2.25.1 python3.8.10 pixhawk2.4.8 下载源码 (已经配置好git环境和ssh) git clone --recurse-submodules gitgithub.com:ArduPilot/ardupilot.gitcd ardupilotgit status使用git status检查是否下载完整 如果不完整&a…

Nuxt 菜鸟入门学习笔记:路由

文章目录 路由 Routing页面 Pages导航 Navigation路由参数 Route Parameters路由中间件 Route Middleware路由验证 Route Validation Nuxt 官网地址: https://nuxt.com/ 路由 Routing Nuxt 的一个核心功能是文件系统路由器。pages/目录下的每个 Vue 文件都会创建一…

hadoop测试环境sqoop使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Sqoop看这篇文章就够了_must contain $conditions in where clause._SoWhat1412的博客-CSDN博客 大数据环境 C:\Windows\System32\drivers\etc 修改ip和hostname的对应关系 1…

将本地项目上传至Github详解

目录 1 前言2 本地代码上传2.1 命令行方法2.2 图形界面法2.3 结果 1 前言 GitHub是一个面向开源及私有软件项目的托管平台,因为只支持Git作为唯一的版本库格式进行托管,故名GitHub 。开发者常常将github作为代码管理平台,方便代码存储、版本…

统计物理学复习----热力学的基本规律

General Laws of thermodynamics 热力学系统常识 单位制 1大气压强 101325 Pa 基本概念与专业英语 状态参量 pressurevolumetemperature Extensive quantityIntensive quantityMechanicalVPThermal ST Helmholtz Free EnergyEnthalpyInternal EnergyGibbs Free Energy 准…