C语言 ——— 指针笔试题(中篇)

指针加减整数和解引用的笔试题 

笔试题1:

int a[5][5];
int(*p)[4];
p = a;printf("%p  %d", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);

问:打印的结果为?(分别以 %d 和 %p 的形式打印)

解析:p = a; 

a是一个二维数组,a单独拿出来时是数组名,表示首元素的地址,而二维数组首元素的地址就是第一行元素的地址(也就是一个一维数组),那么这里a的类型是 int(*)[5] ,p是一个指针,这个指针的类型是 int(*)[4] ,把 a赋值给p ,那么把a赋值给p会发生截断,而p每次只能访问4个字节

解析:&p[4][2] - &a[4][2]

内存示意图:

p 每次加1只能访问4个字节,且同一空间的 指针 减去 指针 得到的是指针之间的元素个数,所以 &p[4][2] - &a[4][2] 以%d 的形式打印的结果是 -4 (因为是小地址 减去 大地址,且指针减指针没有绝对值的概念)

所以 &p[4][2] - &a[4][2] 以%d打印的结果是 -4

-4 存储在内存中补码的示意图:

以%p的形式打印,那么会把 -4的补码当作地址打印出来,这时就没有正负数之分了

-4 的补码以%p的形式打印示意图:

每4位二进制表示一位十六进制

所以 &p[4][2] - &a[4][2] 以%p的形式打印的结果是 FFFFFFFC 


笔试题2:

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\n", (ptr1 - 1), *(ptr2 - 1));

问:打印的结果为? 

代码解析:

aa是一个2行5列的二维数组,所以 { 1,2,3,4,5,6,7,8,9,10 } 等价于 { {1,2,3,4,5} , {6,7,8,9,10} }

解析:int* ptr1 = (int*)(&aa + 1); 

&数组名,取出的是整个数组的地址,加1后指向的是数组最后一个元素的下一个位置的地址,把地址强制类型转换为 int* 类型,再用 int* 类型的ptr1接收

解析:*(ptr1 - 1) 

ptr1 指向的是aa数组的最后一个元素的下一个位置,减1后指向了数组最后一个元素的首地址,再解引用,就拿到了数组的最后一个元素,且最后一个元素是10

所以 *(ptr1 - 1) 以%d的形式打印的结果是 10

解析:int* ptr2 = (int*)(*(aa + 1)); 

aa是数组首元素地址,而二维数组的首元素地址是第一行所以元素的地址,也就是一个一维数组,那么 aa + 1 后指向的是数组第二行的所以地址,强制类型转换为 int* 后赋值给 int* 类型的ptr2,那么此时ptr2指向的就是二维数组aa 的第二行的第一个元素的首地址,也就是元素为6的首地址

解析:*(ptr2 - 1) 

因为不论是一维数组还是二维数组,存储在内存中的数据都是连续的,所以 ptr2 - 1 就指向了数组的 上一个元素的首地址,也就是 5 这个元素的首地址,再解引用,拿到的就是5这个元素

所以 *(ptr2 - 1) 以%d的形式打印的结果是 5


笔试题3:

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

问:打印的结果为? 

代码解析:

a是一个字符指针数组,a的类型是char**,存储的并不是常量字符串,存储的是常量字符串的首元素地址,所以存储每个元素的类型是 char*

解析:char** pa = a; 

a是一个二级指针,要存储a的话,需要二级指针才能存储,所以存储到的是 char** 类型的 pa,此时的pa指向的也是 数组a 首元素的地址,也就是 字符 'w' 的首地址

解析:*(pa + 1) 

pa + 1 后就指向了 数组a中的第二个元素的首地址,再通过%s的形式打印 ,打印的就是第二个常量字符串

所以 *(pa + 1) 以%s的形式打印的结果是 "at" 

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

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

相关文章

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第六十二章 定时器按键消抖实验

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

linux系统ShellCheck检查shell脚步语法正确的工具

目录 ShellCheck 安装ShellCheck 、dnf、yum 源代码编译 步骤如下: 示例命令: 方法三:使用其他第三方仓库、COPR 仓库 假设 ShellCheck 输出如下: 分析输出 修改脚本 再次运行 ShellCheck 1. Shell 脚本最佳实践 主题…

环境如何搭建部署Nacos

这里我使用的是Centos7, Nacos 依赖 Java环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用 ## 1、下载安装JDK wget https://download.oracle.com/java/17/latest/jdk-17_linux-x6…

不同类型游戏安全风险对抗概览(下)| FPS以及小游戏等外挂问题,一文读懂!

FPS 游戏安全问题 由于射击类游戏本身需要大量数值计算,游戏方会将部分计算存放于本地客户端,而这为外挂攻击者提供了攻击的温床。可以说,射击类游戏是所有游戏中被外挂攻击最为频繁的游戏类型。 根据网易易盾游戏安全部门检测数据显示&#…

AWS-负载均衡-创建一个对外的HTTPS ALB

目录 介绍 功能差异 适用场景 性能比较 补充 基本组成部分 创建流程 介绍 Elastic Load Balancing 支持三种类型的负载均衡器:Application Load Balancer、Network Load Balancer 和 Classic Load Balancer。这里用ALB( Application Load Balancer)说明。 功…

聊聊ChatGLM-6B部署与微调的深入理解

前言 ChatGLM的部署,主要是两个步骤: 在Github上下载chatglm的库文件在Hugging Face上下载模型参数与配置文件 ChatGLM包 从Github上看ChatGLM项目文件的结构来看,仅仅是包含三种部署方式的py代码与微调的py代码 而相关的实现细节&#…

黑马JavaWeb后端案例开发(包含所有知识点!!!)

目录 1.准备工作 环境搭建 开发规范 REST(REpresentation State Transfer),表述性状态转换,它是一种软件架构风格 注意事项 统一响应结果 2.部门管理功能 查询部门 删除部门 新增部门 RequestMapping 3.员工管理功能 分页查询 批…

Android 10.0 Launcher 启动流程

在前面SystemUI启动流程中说到,在SystemServer中会去启动各种系统服务,这里的launcher也是启动的其中一个服务ActivityManagerService去启动的。在android10之前,系统四大组件的启动都是在ActivityManagerService中,在android10中…

最短路问题中的朴素版Dijkstra算法

最短路问题的朴素版Dijkstra算法 题目 最短路问题需要用到下面的算法(n代表点的数量,m代表边的数量) 朴素版和堆优化版的Dijkstra算法的区别是,朴素版比较适合稠密图,堆优化版适合稀疏图,稠密图代表它的边…

python | TypeError: list indices must be integers or slices, not tuple

python | TypeError: list indices must be integers or slices, not tuple 在Python编程中,TypeError: list indices must be integers or slices, not tuple 是一个常见的错误。此错误通常发生在尝试使用非整数(如元组)作为列表索引时。本…

RK3568笔记四十九:W25Q64驱动开发(硬件SPI1)

若该文为原创文章,转载请注明原文出处。 一、SPI介绍 串行外设接口 (Serial Peripheral interface) 简称 SPI,是一种高速的,全双工,同步的通信总线,并 且在芯片的管脚上只占用四根线,节约了芯片的管脚。 …

Python写UI自动化--playwright(在UI元素上悬停)

要在UI元素上执行鼠标悬停(hover)动作,可以使用page.hover()方法。这个方法使鼠标指针移动到指定的元素上,就像用户将鼠标悬停在该元素上一样。这对于触发那些依赖于鼠标悬停事件的行为(如显示下拉菜单、提示框或其他动…

[极客大挑战 2019]PHP1

打开题目 游戏界面 猜测php里面有文件,我们可以用dirsearch 扫描一下这个服务器 执行命令 dirsearch -u http://2999dfd5-1d43-4a81-a088-9e41c9dccab4.node4.buuoj.cn/ -e php > test.log 最后在log文件中找到一个 200 www.zip 浏览器输入payload下载下来 …

操作系统_内存管理学习心得

1. 操作系统结构 1.1 内核 计算机是由各种外部硬件设备组成的,比如内存、cpu、 硬盘等,如果每个应用都要和这些硬件设备对接通信协议,那这样太累了,所以这个中间人就由内核来负责,让内核作为应用连接硬件设备的桥梁,应用程序只需关心与内核交写&#x…

C++ | Leetcode C++题解之第283题移动零

题目&#xff1a; 题解&#xff1a; class Solution { public:void moveZeroes(vector<int>& nums) {int n nums.size(), left 0, right 0;while (right < n) {if (nums[right]) {swap(nums[left], nums[right]);left;}right;}} };

SpringBoot集成GraalVM创建高性能原生镜像

1. GraalVM 原生镜像的介绍 GraalVM原生镜像为部署和运行Java应用程序提供了一种新的方式。与Java虚拟机相比&#xff0c;原生镜像可以以更小的内存占用和更快的启动时间运行。 它们非常适用于使用容器镜像部署的应用程序&#xff0c;当与 "功能即服务"&#xff08…

短剧系统源码分享,快速搭建部署上线教程

一、短剧系统是什么&#xff1f; 短剧制作平台&#xff0c;作为一站式综合解决方案&#xff0c;集剧本创作、角色设计、场景搭建、视频编辑、便捷发布及深度数据分析能力于一身。该平台精准定位于助力企业利用短剧形式强化品牌传播力并驱动商业价值增长&#xff0c;无论企业是…

什么是IO多路复用?其原理和用途是什么?

什么是IO&#xff1f; IO&#xff1a;Input/Output&#xff0c;即数据的读取&#xff08;接收&#xff09;/写入&#xff08;发送&#xff09;操作&#xff0c;针对不同的数据存储媒介&#xff0c;大致可以分为网络 IO 和磁盘 IO 两种。在 Linux 系统中&#xff0c;为了保证系…

关于Excel表格隔行取列的方法

关于Excel表格隔行取列的方法 1、场景显示2、参考文章 1、场景显示 ①处的公式&#xff1a; INDEX($B3:$G3,(COLUMN(A1)*2)) $B与$G可以限制列不变&#xff1b; COLUMN(A1)返回1&#xff1b; 含义&#xff1a; 在选定区域选择偶数列的数据&#xff1b; 如果是奇数列的话是(COL…

查看RAM和Flash

0 Preface/Foreword 1 查看方法 1.1 map文件中查看 1.1.1 RAM可用情况 在map文件中&#xff0c;搜索字符串&#xff1a;free_ramcp 该字段表示剩余可用的RAM大小&#xff0c;前面对应的是hexadecimal的数值&#xff08;单位Byte&#xff09;&#xff0c;就是剩余可用的RA…