详解7道经典指针运算笔试题!

目录

 ​编辑

1. 题目一

(1)代码

(2)分析 

2. 题目二

(1)代码

(2)分析

3. 题目三

(1)代码

(2)分析

4. 题目四

(1)代码

(2)分析

5. 题目五

(1)代码

(2)分析

6. 题目六

(1)代码

(2)分析

7. 题目七

(1)代码

(2)分析

四. 完结散花


 

                                            悟已往之不谏,知来者犹可追  

创作不易,宝子们!如果这篇文章对你们有帮助的话,别忘了给个免费的赞哟

1. 题目一

(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;
}
//程序的结果是什么?

(2)分析 

 再分析题目之前,我们需要知道:

1. 对于数组名来说,一般情况下数组名代表首元素地址~

2. 然而,有俩个特例:其一,sizeof(数组名)计算的是整个数组的大小,该数组名代表整个数组。其二,&(数组名)也是代表整个数组~

 接下来这个题目就显得非常简单了~

&a我们拿到整个数组的地址,再加一就是跳过整个数组

注意这里我们把(&a+1)强制类型转换成了int*,所以ptr-1相当于往后跳过一个整形,

所以*(ptr-1)=5.

*(a+1)这里a代表首元素地址,类型为int*,所以加一跳过一个整形(即*(a+1)=2

实际上*(a+1)==a[1];

 

2. 题目二

(1)代码

//题目二
//在X86环境下
//下面结构体的⼤⼩是16个字节
//程序输出的结构是啥?
struct Test
{
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p = (struct Test*)0x100000;
int main()
{
	printf("%p\n", p + 0x1);
	printf("%p\n", (unsigned long)p + 0x1);
	printf("%p\n", (unsigned int*)p + 0x1);
	return 0;
}

(2)分析

首先我们定义了一个类型是结构体指针的变量p,并且我们给了他一个地址为0x100000。所以,(P+0x1)就相当于该指针向后跳过了一个该结构体类型,该结构体的大小为16个字节,所以在16进制下%p打印的结果应该为0x100010

(unsigned long)p + 0x1,首先p被强制类型转换成了无符号的长整型,再加一就相当于普通的算术运算,所以结果应该为0x100001

(unsigned int*)p + 0x1,同理,p被强制类型转换成了无符号的普通整形指针,所以加一就相当于跳过了一个无符号的普通整形的大小,所以结果应该为0x100004

3. 题目三

(1)代码

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

(2)分析

这个题目有两种理解方法:

1.  p[0]可以理解为a[0][0],这是二维数组的访问,我们通常将其简单的理解为访问第一行的第一个元素~

2. p=a[0]我们可以分两步理解,a[0]=*(a+0)即是我们拿到了第一行的地址相当于第一行的数组名,而第一行的数组名又相当于该行首元素的地址,然后,p[0]==*(p+0),首元素地址加一再解引用访问到该行的第一个元素~

到这里,相信大多数人都会觉得答案是0,然而,请注意(0,1)使用的括号而不是大括号,该表达式等价于int a[3][2] = { 1 ,3,5 };

所以结果应该为1

4. 题目四

(1)代码

//题目四
//假设环境是x86环境,程序输出的结果是啥?
#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;
}

(2)分析

&a[4][2]我们可以很简单的理解到就是拿到第四行第二个元素的地址啦~

p=a,可以分两步来理解,a=代表首元素的地址,也就是第一行的地址,我们用一个数组指针来接收第一行的地址,不过他的元素个数是4而不是5,也就是意味着,但我们跳过一行时实际上只跳过了4个整形,那这道题就显得很简单了~

 我们都知道两个地址相减(即指针减指针)的绝对值的结果是两个指针之间的元素个数,所以%d打印的就是-4,但%p打印的是地址,地址没有负数,所以在编译的过程中就会发生算数转换~

5. 题目五

(1)代码

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

(2)分析

这题相对来说就很简单了,这里就不多做解释了~

6. 题目六

(1)代码

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

(2)分析

char* a[] = { "work","at","alibaba" };是一个字符指针数组,char** pa = a;用一个二级指针来指向“work",pa++,则pa指向”at“

7. 题目七

(1)代码

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

(2)分析

这个题目可能相对来说较为复杂一些,不过把图画出来也是简单啦~

四. 完结散花

好了,这期的分享到这里就结束了~

如果这篇博客对你有帮助的话,可以用你们的小手指点一个免费的赞并收藏起来哟~

如果期待博主下期内容的话,可以点点关注,避免找不到我了呢~

我们下期不见不散~~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发为什么这么火,现在入行鸿蒙是否来的及?

鸿蒙开发是当前备受关注的技术领域之一&#xff0c;对于想要入门学习鸿蒙开发的初学者来说&#xff0c;需要掌握一定的基础知识和技能。鸿蒙开发又是否能为程序员们带来一片光明的未来呢&#xff1f;让我们一同探讨这些问题。 对于初学者来说&#xff0c;鸿蒙开发是否易于上手呢…

构建空间场景轻应用,Mapmost Alpha来啦【文末赠书(10本)--第一期】

文章目录&#xff1a; 一、Mapmost Alpha 介绍二、Mapmost Alpha应对数字孪生业务痛点解决之道2.1 Mapmost Alpha 提供海量城市底板2.2 Mapmost Alpha 提供便捷的配置管理工具2.3 Mapmost Alpha 提供一键式部署发布和分享 三、沉浸式体验Mapmost Alpha3.1 创建应用3.2 新手指导…

树莓派安装Nginx服务搭建web网站结合内网穿透实现公网访问本地站点

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务器&#xff0c;Ngi…

Everything:文件查找工具,一搜即得

名人说&#xff1a;东边日出西边雨&#xff0c;道是无晴却有晴。——刘禹锡 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、软件介绍①Everything②核心功能③原理 二、下载安装①下载②安装 三、使用方法①文…

如何利用音频转换器将多个MP3音频转换为OGG格式

现在&#xff0c;我们接触到的很多音频文件一般都是MP3格式的。但是我们偶尔也需要用到ogg格式的音频文件&#xff0c;所以就需要我们将MP3格式音频文件转换为ogg格式了&#xff0c;那么&#xff0c;如果想要将MP3格式文件转换为OGG格式该如何操作呢&#xff1f;相信很多朋友心…

Linux内核之报错-Werror,-Wunused-variable等通用解决方案(二十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

企业数据备份体系化方法论的七大原则之二:区分环境数据与业务数据

在之前讨论的分布式存储系统七大原则的第一原则中&#xff0c;我们了解了容灾切换和数据备份的差异。现在&#xff0c;我们继续探索第二原则&#xff1a;区分环境数据与业务数据。这一原则强调了两种类型数据在变化频率、价值以及数据一致性获取难度方面的根本区别&#xff0c;…

Python中starmap有什么用的?

目录 前言 starmap函数的作用 starmap函数的用法 starmap函数的示例 1. 对每个元组元素进行求和 2. 对每个元组元素进行乘积 实际应用场景 1. 批量处理函数参数 2. 并行处理任务 3. 批量更新数据库 总结 前言 在Python中&#xff0c; starmap 是一个非常有用的函数&…

Vue3 + antv/x6 实现流程图

新建流程图 // AddDag.vue <template><div class"content-main"><div class"tool-container"><div click"undo" class"command" title"后退"><Icon icon"ant-design:undo-outlined" /…

用信号的方式回收僵尸进程

当子进程退出后&#xff0c;会给父进程发送一个17号SIGCHLD信号&#xff0c;父进程接收到17号信号后&#xff0c;进入信号处理函数调用waitpid函数回收僵尸进程若多个子进程同时退出后&#xff0c;这是切回到父进程&#xff0c;此时父进程只会处理一个17号信号&#xff0c;其他…

pycharm手动安装常用插件

下载插件 &#xff08;1&#xff09;下载地址&#xff1a;JetBrains Marketplace 这里以语言包为例子 2、中文语言包 进入pycharm中的设置&#xff0c;点击plugins,选从磁盘中安装插件

2024.3.11 训练记录(13)

继续补题 文章目录 ICPC 2018青岛I Soldier GameICPC 2018青岛K Airdrop ICPC 2018青岛I Soldier Game 题目链接 线段树 果然稍微复杂一点的线段树就很难实现啊&#xff0c;不看题解根本没反应过来是线段树 struct Node {int l, r, lb, rb, nb, b; } tr[N * 4];其中&#x…

帮管客 CRM jiliyu SQL注入漏洞复现

0x01 产品简介 帮管客CRM是一款集客户档案、销售记录、业务往来等功能于一体的客户管理系统。帮管客CRM客户管理系统,客户管理,从未如此简单,一个平台满足企业全方位的销售跟进、智能化服务管理、高效的沟通协同、图表化数据分析帮管客颠覆传统,重新定义企业管理系统。 …

不知道吧,腾讯云轻量应用服务器使用有一些限制!

腾讯云轻量应用服务器相对于云服务器CVM是有一些限制的&#xff0c;比如轻量服务器不支持更换内网IP地址&#xff0c;不支持自定义私有网络VPC&#xff0c;内网连通性方面也有限制&#xff0c;轻量不支持CPU内存、带宽或系统盘单独升级&#xff0c;只能整个套餐整体升级&#x…

使用Git拉取代码时候出现error file write error no space left on device问题如何解决

1. 检查磁盘空间 首先&#xff0c;确认是哪个分区或驱动器满了。你可以使用以下命令来查看各分区的使用情况&#xff1a; 对于 Linux 或 macOS&#xff1a; df -h对于 Windows&#xff0c;你可以在“我的电脑”中查看各驱动器的剩余空间&#xff0c;或者在命令提示符&#x…

基于遗传算法改进的RBF神经网络流量控制,基于GA-RBF的流量预测

目录 完整代码和数据下载链接:基于遗传算法改进的RBF神经网络流量控制,基于GA-RBF的流量预测(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88937452 RBF的详细原理 RBF的定义 RBF理论 易错及常见问题 RBF应用实例,基于遗传算法改…

力扣刷题Days15第二题-137. 只出现一次的数字 II(js)

目录 1&#xff0c;题目 2&#xff0c;代码 2.1哈希表 2.2 依次确定每一个二进制位 3&#xff0c;学习与总结 1. 左移运算符 (<<) 2. 有符号右移运算符 (>>) 3. 无符号右移运算符 (>>>) 1&#xff0c;题目 给你一个整数数组 nums &#xff0c;除…

不要在代码中随便使用try...catch了

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 背景 js中的try...catch try...catch运行机制 js的事件循环机制 try...c…

PMP没过能考下一次吗?PMP·考试不过下次费用多少?

每年都有许多人参加PMP考试&#xff0c;然而&#xff0c;并不是每个人都能一次性通过PMP考试&#xff0c;许多人可能会面临失败。带你了解PMP补考费用以及补考流程 01PMP补考费用是多少 考生若未能成功通过考试&#xff0c;还可以在一年PMI有效期内提交补考申请&#xff0c;若…

【文件增量备份系统】使用Mysql的流式查询优化数据清理性能(针对百万量级数据)

文章目录 功能介绍原始方案测试 流式处理测试 功能可用性测试 功能介绍 清理功能的作用是&#xff1a;扫描数据库中已经备份过的文件&#xff0c;查看数据源中是否还有相应的文件&#xff0c;如果没有&#xff0c;说明该文件被删除了&#xff0c;那相应的&#xff0c;也需要将…