指针笔试题分享

今天给大家分享几道关于指针的好题,我觉得的只要是题,都是好题咯!下面来看看我们今天的题吧!

题目一:

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

数组a里面有5个元素,下面定义了一个整形指针变量指向了(int*)(&a+1),那么我们现在主要就是找到指针变量ptr所指向的位置:

 如图所示,就是我们ptr所指向的位置,下面对其*(a + 1),那么此时就指向2的地址了,再对其简引用,那么就是我们的2了。 *(ptr - 1)指针ptr-1就指向了我们5的地址了。所以我们的最终结果为2,5!


 题目二:


#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
struct Test
{
	int Num;
	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;
}

在X86环境下,假设结构体的⼤⼩是20个字节,程序输出的结构是啥?

p是我们的结构体指针,p+0x1这里就是我们的结构体指针加一了,那么此时加的就是一个结构体的大小,上面告诉我们了为20个字节,那么p+0x1 = 0x100000+20 = 0x100014(这里是十六进制)!

第二个被强制转换为无符号长整形了,那么此时就是就是整数的加减运算了,p+0x1 = 0x10000+1=0x100001!

第三个被强制转换为一个整型指针类型了,此时在X86的环境下,指针的大小为4个字节,那么p+0x1 = 0x100004!

我们来看看结果:

 题目三:

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

可能大家在看见这道题是,想当然的就知道了数组的排列,

 如果真的这样想的话,其实就错了,注意里面是()而不是{},那么我们就要先进行里面的”,“运算了,所以我们的数组a其实是这样的!

 定义了一个整型指针类型指向我们的a[0],a[0]表示的是第一行的地址,此时就表示首元素的地址,那么p[0]就指向我们的1,所以结果为1!

 


题目四:


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

假设环境是x86环境,程序输出的结果是啥?

有一个数组a有25个元素(5行5列),下面定义了一个数组指针,里面有四个元素,然后p = a!把a的首元素地址给了p!因为二维数组在我们的内存中也是连续存放的,所以我们可以这样画:

 那么此时我们就可以很好的找到位置进行计算了,

 我们知道随着数组下标的增长,地址由低地址指向高地址,所以&p[4][2] - &a[4][2]是一个低地址减一个高地址,地址减地址的绝对值表示之间的元素个数,所以以%d打印时,结果是我们的-4!以%p打印时,以-4作为一个地址来打印,在内存中我们的数是以补码存储的,所以我们打印地址时就是打印-4的补码:

 所以我们的结果为FFFFFFFC和-4!


题目五:

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

&aa是取出的整个二维数组的地址,加一之后就指向了二维数组的后面了,而(aa+1),aa表示首元素的地址,而在二维数组中则表示第一行的地址,加一之后就指向了第二行元素:

 所以ptr-1后指向了10的地址,ptr2-1后则指向了5的地址,所以我们的结果为:10,5


题目六: 

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

a是一个指针数组,里面存放的是char*类型的元素,下面是char** pa = a;表示将a的首元素地址传给了pa,pa指向的对象类型是char*的,我们可画图来作答:

 pa++后指向了a[1],对其简引用之后那么就是打印我们的字符串at了!

 


题目七:

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

C是一个指针数组,数组C里面的元素为char*类型,数组CP里面存放的是char**类型,将C的首元素地址传到CP中,CPP中的元素为char***。我们画图来理解:

 printf("%s\n", **++cpp); 加加cpp,那么之后就跳到了c+2,对其简引用后就指向了我们的c[2],再对其简引用之后便指向了我们的POINT的首地址,那么此时打印的就是我们的 POINT!

 printf("%s\n", *--*++cpp+3); +3的优先级是最低的,所以我们最后算。上面我们的cpp跳到了我们的c+2,然后这里再加加之后就指向了c+1这个位置了,然后再对其简引用,此时就指向了我们的a[1],然后再减减,此时就变为了我们的a[0]了,此时再对其简引用就指向了我们ENTER的首地址,再加三后,指向了我们的E,所以这里我们就打印我们的 ER!

 printf("%s\n", *cpp[-2]+3); cpp[-2]=*(cpp-2),所以此时指向了我们的c+3,对其简引用之后指向了我们的c[3],然后再对其简引用之后就指向了我们FIRST的首元素,之后再加三后就指向了S,所以我们这里打印的是 ST!

 printf("%s\n", cpp[-1][-1]+1);cpp[-1][-1] = *(*(cpp-1)-1),cpp-1后指向了c+2了,然后再对其简引用后便指向了我们的c[2]了,之后再减一就就跳到我们的c[1]了,然后再对其简引用之后便指向了NEW的首地址,然后加一指向了E,所以最后打印的是我们的EW!

所以所做这类似的题时:画图对我们的帮助是非常大的,一定要多画图来看看!不知道你看完之后有没有些感触,哈哈,如果有的话,点个赞吧!

拜拜咯,我们下期再见!

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

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

相关文章

内网渗透之Linux权限提升大法

文章目录 内网渗透|Linux权限提升大法0x01 前言0x02 工具介绍1.traitor2.LinEnum3.linux-exploit-suggester.sh4.Linux Exploit Suggester 25.beroot 0X02提权手法1.环境变量提权2.利用suid提权3.定时任务提权3.1定时任务文件覆盖提权3.2定时任务tar命令通配符注入提权 4.sudo提…

SPSS信度分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

【shell】脚本实现将开发机user1账户下的abc文件夹复制到user2~4账户下

1 主要内容 可以使用Shell脚本来实现将开发机&#xff08;Linux&#xff09;上user1账户下的abc文件夹复制到user2、user3和user4账户下。 #!/bin/bash# 数组赋值&#xff0c;目标用户列表 # target_users(user2 user3 user4) # 定义数组 target_users()# 生成user数字的数组…

h5小游戏-盖楼游戏

盖楼游戏 一个基于JavaScrtipt、Html5 的盖楼游戏 效果预览 点我下载源代码 Game Rule 游戏规则 以下为默认游戏规则&#xff0c;也可参照下节自定义游戏参数 每局游戏生命值为3&#xff0c;掉落一块楼层生命值减1&#xff0c;掉落3块后游戏结束&#xff0c;单局游戏无时间限…

如何在 Photoshop 中删除颜色

如何在 Photoshop 中删除某种颜色的简单方法 如何在 Photoshop 中删除颜色 步骤1 有很多方法可以在 Photoshop 中删除颜色。作为一般概述&#xff0c;我们希望进行选择&#xff08;在本例中为我们的颜色&#xff09;&#xff0c;然后操作该选择&#xff08;通常删除或屏蔽内容…

Ubuntu开机显示recovering journal,进入emergency mode

在一次正常的shutdown -r now之后&#xff0c;服务器启动不起来了&#xff0c;登录界面显示recovering journal&#xff0c;主要报错信息如下所示&#xff1a; /dev/sda2:recovering journal /dev/sda2:Clearn... You are in emergency mode. After logging in, type journalc…

git 对已有的项目代码建立github仓库

首先在项目根路径下使用以下命令初始化git配置文件&#xff1b; git init关联github仓库地址&#xff0c;我这里使用的是SSH连接方式&#xff1b; git remote add origin gitgithub.com:xxxxx.git关联main分支&#xff0c;其中current_branch代表着你需要push的分支&#xff…

Ubuntu 22.04安装vscode

要在Ubuntu 22.04安装vscode&#xff0c;请完成这些步骤。 首先apt命令更新软件包索引并安装导入微软GPG密钥的依赖软件。 更新&#xff0c;近期内执行过可忽略 sudo apt update安装工具包 sudo apt install software-properties-common apt-transport-https curl当导入GPG后…

快速掌握接口自动化测试的技巧和方法!

通过用Python实现头条项目接口自动化测试&#xff0c;下面一起来学习。 目标 1. 熟悉接口自动化测试的流程2. 能够对一个项目的接口实现自动化测试 接口自动化测试流程 1. 需求分析2. 挑选需要做自动化测试的功能3. 设计测试用例4. 搭建自动化测试环境[可选]5. 设计自动化测…

英语学习软件 Eudic欧路词典 mac中文版介绍说明

欧路词典 mac (Eudic) 是一个功能强大的英语学习工具&#xff0c;它包含了丰富的英语词汇、短语和例句&#xff0c;并提供了发音、例句朗读、单词笔记等功能。 Eudic欧路词典 mac 软件介绍 多语种支持&#xff1a;欧路词典支持多种语言&#xff0c;包括英语、中文、日语、法语…

提高文字识别率的顶级技巧(图片转excel表格文字图片录入篇)

在日常的客服工作中&#xff0c;有很多用户会问我们一个相同的问题&#xff1a;你们的金鸣识别系统识别率能达到百分之几&#xff1f;能不能达到99%甚至100%&#xff1f;我们先来举个极端的例子&#xff1a;用户上传一张图片给我们程序识别&#xff0c;这张图片上的字是手写的&…

【C/C++】素数专题

素数专题 1.判断素数模板2.求范围内的素数&#xff08;101-200&#xff09;3.判断素数与分解 1.判断素数模板 #include<stdio.h> #include<math.h>int prism(int n){if(n1) return 0;for(int i2;i<sqrt(n);i){if(n%i0) return 0;}return 1; }int main() {int n…

JavaFx 设置窗口边框圆角

UI界面要求窗口边框有一定弧度&#xff0c;因为之前没有做过&#xff0c;网上看了很多文章&#xff0c;都用到了css语句 "-fx-background-radius: ; 我在xml布局文件根节点使用无效&#xff0c;在Scene组件设置无效&#xff0c;gpt等ai问了一圈代码也是无效&#xff0c;…

mysql查询表的字段,字段名以及注释sql语句

sql语句如下&#xff1a; selecta.ordinal_position 序号,a.COLUMN_name 字段名,a.COLUMN_type 字段类型,(case a.is_nullable when NO then 是 else 否 end) 是否非空,(case a.column_key when PRI then 是 else 否 end) 是否主键,a.COLumn_comment 注释 frominformation_sch…

4.4 抗锯齿

一、锯齿是怎么产生的 二、抗锯齿介绍 1.SSAA(super sample anti-aliasing) 拿4xSSAA举例子&#xff0c;假设最终屏幕输出的分辨率是800x600, 4xSSAA就会先渲染到一个分辨率1600x1200的buffer上&#xff0c;然后再直接把这个放大4倍的buffer下采样至800x600。这种做法在数学上…

HBase之Region Splitting

目录 Region Splitting步骤 Region状态过程 Region Splitting 步骤 RegionServer开始split region&#xff0c;SPLIT事务开启。RegionServer在表上获取共享读锁防止split过程中数据被修改。接着在zk中创建一个znode&#xff0c;标记为SPLITTING。Master 将会观察到该znode的创…

Jmeter接口测试——使用教程(上)

前言 jmeter是一款小巧&#xff0c;轻便、开源的性能测试工具&#xff0c;它也可以很方便的进行接口测试。 下面我就带大家学习下jmeter接口测试。 一、Jmeter简介 Jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使…

镜头光圈参数详解和示例,如F2.8-16

光圈&#xff1a; 光圈用F值来表示&#xff0c;以镜头焦距f和通光孔径D的比值来衡量。F值越大&#xff0c;光圈越小&#xff1b;F值越小&#xff0c;光圈越大。 镜头表面标的F2.8-16是指相机镜头孔径的大小。如上图所示&#xff0c;光圈大小F2.8-16范围是F2.8、F4、F5.6、F8、…

量子计算突破云渲染资源调度!真机测试完整报告公开!

​摘要&#xff1a;在影视领域中&#xff0c;经常会涉及大量的视频图像渲染工作&#xff0c;而往往在这种大规模、动态渲染场景下&#xff0c;普遍存在着冗余渲染现象。究其原因在于大规模的图像渲染通常要求在短时间内做出渲染任务的算力分配决策&#xff0c;而经典计算机无法…

electron+vue3全家桶+vite项目搭建【26】electron本地安装Vue Devtool插件,安装浏览器扩展

文章目录 引入获取vue devtool导入插件排除插件的npm脚本最终效果 引入 demo项目地址 Vue Devtools插件是vue项目必备插件&#xff0c;它是安装在浏览器里的&#xff0c;而咱们的electron中实际就包含了一个浏览器&#xff0c;同理它也可以加载浏览器插件 获取vue devtool 直…