指针运算笔试题解析(1)

news2024/11/24 20:13:38

指针运算笔试题解析

    • 题目一
      • 解析
    • 题目二
      • 解析
    • 题目三
      • 解析
    • 题目四
      • 解析
    • 题目五
      • 解析

题目一

#include<stdio.h>
int main()
{
	int a[5]={1,2,3,4,5};
	int *p=(int*)(&a+1);
	printf("%d %d",*(a+1),*(p-1));
	return 0;
} 

答案:2 5

解析

int a[5]={1,2,3,4,5};

先定义一个arr[5]整型数组,将1,2,3,4,5放置arr[5]中。

int *p=(int*)(&a+1);

取arr数组的地址再加1,使得p指向arr整个数组之后的第一个地址,再强制类型转化为int*类型,使得p的指向就是arr[4]即5之后的第一个地址。

printf("%d %d",*(a+1),*(p-1));

*(a+1)指的是arr首元素地址+1,相当于arr[1],所以*(a+1) == 2
*(p-1)指的是5之后的第一个地址-1,相当于又变为了5,所以*(p-1) = 5

题目二

//x86环境下,结构体的大小为20
#include<stdio.h>
struct Test
{
	int num;
	char* pch;
	short data;
	char cha[2]; 
	short arr[4];
}*p=(struct Test*)0x100000;

int main()
{
	printf("0x%x\n",p+0x1);
	printf("0x%x\n",(unsigned long)p+0x1);
	printf("0x%x\n",(unsigned int*)p+0x1);
	return 0;
}

答案:

0x100014
0x100001
0x100004

解析

printf("0x%x\n",p+0x1);

这里的pstruct Test*类型指向的是struct Test类型,所以p+1的时候就跳过了一整个结构体,所以p的地址要加20,而地址的存储是以16进制打印的,所以答案就是0x100014

printf("0x%x\n",(unsigned long)p+0x1);

这里的p被强制类型转化为了unsigned long,所以p就变成了一个长整型的整数,故(unsigned long)p+1就是0x100001

printf("0x%x\n",(unsigned int*)p+0x1);

同理,p被强制类型转化为了unsigned int*他指向的是unsigned int类型,p+1的时候就跳过了一整个结构体,所以p的地址要加4,所以答案就是0x100004

题目三

//x86环境下
//编译器为小端存储
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;
} 

答案:4 2000000

解析

int a[4]={1,2,3,4};

先定义一个arr[5]整型数组,将1,2,3,4放置arr[4]中。

int* ptr1=(int*)(&a+1);

与第一题考法一样,取arr数组的地址再加1,使得p指向arr整个数组之后的第一个地址,再强制类型转化为int*类型,使得p的指向就是arr[3]即4之后的第一个地址。

	int* ptr2=(int*)((int)a+1);

这个比较复杂,需要根据编译器中内存存储的大小端来判断
(大小端不理解可参考数据在内存中的存储)
在这里以VS2022的x86环境为例。
我们先假设数组a的地址为0x00EFF904,a先被(int)强制类型转换为了整型,此时a+1就是地址的整型数字加一,之后a+1又被(int*)强制类型转换为了指针类型,所以ptr2所指向的地址就是0x00EFF905,我们再回到编译器中,如图:
在这里插入图片描述

小端编译器中1的储存为01 00 00 00,翻译过来就是00 00 00 01
所以,我们可以推出存储为00 00 00 02*ptr2,所以*ptr2 == 02 00 00 00,注意:这里的*ptr2是以16进制所表示的。
在这里插入图片描述

	printf("%x  %x",ptr1[-1],*ptr2);

综上,ptr1[-1] == arr[3] == 4,*ptr2 == 2000000

题目四

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

答案:1

解析

这里考察的是逗号表达式,逗号表达式指的是在一个括号中,从左到右以最右的值为返回值例如:(0,1)在数组中只表示1,所以这里的arr就表示为{ {1,3},{5,0},{0,0} },而p指向arr[0] == {1,3}的地址,所以p[0]就表示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;
}

答案:FFFFFFFC -4

解析

int(*p)[4];我们可以知道p是一个指针指向4个整型元素,又因为int a[5][5];所以我们可以推出下图,而指针与指针的相减就是两指针之间的元素个数,所以我们可以得到:&p[4][2] - &a[4][2] == -4
在这里插入图片描述
不过需要注意的是用%p表示-4的时候要转化为相应的16进制表达式,推到过程如下:

-4
原码:10000000 00000000 00000000 00000100
反码:11111111 11111111 11111111 11111011
补码:11111111 11111111 11111111 11111100
16进制:FF FF FF FC

所以答案为FFFFFFFC -4

请添加图片描述

以上就是本期的全部内容了,喜欢请多多关照吧!!!

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

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

相关文章

vscode1.83远程连接失败

&#xff08;报错信息忘记截图了 总之卡在vscode-server.tar.gz的下载那里&#xff0c;一直404&#xff0c;删了C:\Users\Administrator\.ssh\known_hosts也不管用 看了一下vscode1.83的commitID为a6606b6ca720bca780c2d3c9d4cc3966ff2eca12&#xff0c;网友说可以通过以下网…

XUnit单元测试(实用项目)——看完不会用你打我

一、简介 xUnit.net 是针对 .NET 的免费、开源单元测试框架&#xff0c;可并行测试、数据驱动测试。测试项目需要同时引用 xUnit和被测试项目&#xff0c;从而对其进行测试。测试编写完成后&#xff0c;用 Test Runner 来测试项目&#xff0c;Test Runner 可以读取测试代码&am…

最新版付费进群源码带自动定位和分销以及分站功能完整版无加密

简介 看到别人发那些不是挂羊头卖狗肉&#xff0c;要么就是发的缺少文件引流的。非常滴恶心 这源码是我付费花钱买的免费分享给大家&#xff0c;功能完整。而且无加密 功能&#xff1a;新建分销会员&#xff0c;设置账号密码&#xff0c;收款方式等 说明&#xff1a; 分站…

opengl基础笔记1

1、opengl运行模式及opengl规范 运行模式&#xff1a;核心模式与立即渲染模式&#xff08;弃用&#xff09; 由于OpenGL的大多数实现都是由显卡厂商编写的&#xff0c;当产生一个bug时通常可以通过升级显卡驱动来解决。这些驱动会包括你的显卡能支持的最新版本的OpenGL&#xf…

算法题:99.恢复二叉搜索树

&#xff08;为不影响大家的观感&#xff0c;完整题目附在了最后&#xff09; 二叉搜索树的定义 二叉搜索树&#xff08;BST&#xff0c;Binary Search Tree&#xff09;&#xff0c;也称二叉排序树或二叉查找树。 二叉搜索树&#xff1a;一棵二叉树&#xff0c;可以为空&…

二叉树题目:在二叉树中增加一行

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;在二叉树中增加一行 出处&#xff1a;623. 在二叉树中增加一行 难度 5 级 题目描述 要求 给定一个二叉树的根结…

WiFi模块的环境可持续性:可再生能源、材料创新与碳足迹管理

随着数字化时代的到来&#xff0c;WiFi模块已经成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;这种便利也伴随着对环境的一定影响。本文将深入研究WiFi模块在环境可持续性方面的挑战和机遇&#xff0c;重点关注可再生能源的应用、材料创新以及碳足迹管理。 1. 可…

NB-IoT水表和LoRa水表有什么区别?

在众多物联网技术中&#xff0c;NB-IoT和LoRa脱颖而出&#xff0c;广泛应用于智能水表的制造。那么&#xff0c;这两种水表究竟有何区别呢&#xff1f;下面&#xff0c;小编来为大家详细的讲下NB-IoT和LoRa这两者的工作原理以及两者的区别之处&#xff0c;一起来看下吧&#xf…

图片路径名动态生成

写成这样也可以 :src"./src/assets/ScreenLeft/btn${isShowLeft ? Show : Hide}.png"为了节省开销&#xff0c;这种小图标&#xff0c;可以用i标签 const imgUrl ref("icon1");<iclass"w-50px h-50px":style"{backgroundImage: url(./…

老师们看过来,成绩发布原来可以这么简单

成绩发布不再让你头大&#xff01;不再需要每次都要手动查找学生成绩&#xff0c;浪费宝贵的休息时间!现在&#xff0c;只需要掌握一些小技巧&#xff0c;就能轻松实现学生自助查询成绩&#xff01; 引入数据库管理软件 可以引入一些数据库管理软件&#xff0c;例如MySQL、Pos…

Scala 泛型编程

1. 泛型 Scala 支持类型参数化&#xff0c;使得我们能够编写泛型程序。 1.1 泛型类 Java 中使用 <> 符号来包含定义的类型参数&#xff0c;Scala 则使用 []。 class Pair[T, S](val first: T, val second: S) {override def toString: String first ":" sec…

高压放大器的作用和优势是什么

高压放大器是一种专门用于放大高电压信号的设备&#xff0c;它具有许多重要的作用和优势。在以下的文章中&#xff0c;我们将详细介绍高压放大器的作用和优势。 高压放大器的作用之一是在实验室和工程应用中提供对高压信号的放大和控制。许多应用领域&#xff0c;如实验物理、电…

C/C++数据结构-链表-链表合并排序输出

文章目录 前言例题题解带头结点不带头结点 前言 这个小例题涵盖的知识点还是非常多的。包括链表的定义&#xff0c;链表的尾插法&#xff0c;链表的遍历&#xff0c;冒泡排序用链表实现。链表可以使用带头结点和不带头结点的形式&#xff0c;各有千秋。 本文完整版使用带头结点…

美团圈圈私域加群app拉新 单价高一手渠道整理

美团圈圈为我们现在主推产品 可以通过”聚量推客“ 申请推广 一手数据&#xff0c;外面很多其它的数据都会阉割的很厉害&#xff0c;可以对比 下面介绍下圈圈的优势&#xff0c;我们目前圈圈对外结算时间为11天&#xff08;因为美团官方有个要求 10天内退群无效&#xff09;&…

技能证里的天花板—阿里云云计算架构师ACE认证!

在当今的社会中&#xff0c;想要获得一份好工作、得到丰厚的报酬&#xff0c;唯一的方法就是证明自己优秀&#xff0c;能给公司创造价值&#xff0c;是大多数公司想要看到的。 那么在面试过程中&#xff0c;怎么样才能让面试官一眼就记住呢&#xff1f;那一定是有一份足够优秀…

Java生成二维码并打印二维码和文字信息

目录 1、生成二维码&#xff0c;并调用画布进行二维码和文字的描绘。 2、主程序&#xff1a;获取打印机&#xff0c;并打印内容 3、打印效果 参考文献&#xff1a; 前期工作是安装好打印机驱动&#xff0c;可连接打印机。 添加三个依赖jar&#xff1a; 具体见文底的参考文献…

什么情况会造成电表不走数?

电表是衡量用电量的重要设备&#xff0c;一旦出现不走数的情况&#xff0c;不仅会影响用户对用电量的准确计算&#xff0c;还可能造成电费纠纷。那么&#xff0c;究竟什么情况下会造成电表不走数呢&#xff1f;接下来&#xff0c;小编来为大家介绍下&#xff0c;一起来看下吧&a…

学习使用php实现汉字验证码

学习使用php实现汉字验证码 <?php //开启session &#xff0c;方便验证 session_start(); //创建背景画布 $image imagecreatetruecolor(200, 60); $background imagecolorallocate($image, 255, 255, 255); imagefill($image, 0, 0, $background);//创建背景画布 for ($…

【腾讯云HAI域探秘】AI让我变成灵魂画手

【腾讯云HAI域探秘】AI让我变成灵魂画手 文章目录 【腾讯云HAI域探秘】AI让我变成灵魂画手前言环境搭建进入 StableDiffusionWebUI使用 高性能应用服务HAI 部署的 StableDiffusionWebUI 快速进行AI绘画总结 前言 最近有幸参与了腾讯云举办的 腾讯云 HAI 产品体验活动。在这个过…

解决VS中文编译时出现:常量中有换行符

错误如下 首先确定文件编码格式已经是utf-8了&#xff0c;然后在有中文的情况的下&#xff0c;编译时会报错&#xff0c;真的很恶心 tabWidget.addTab(widget, tr("材料库"));tabWidget.addTab(widget1, tr("B"));解决方案 通过在项目里设置编译选项: /utf…