【C生万物】 指针和数组笔试题汇总 (下)

 欢迎来到 Claffic 的博客 💞💞💞                               👉 专栏:《C生万物 | 先来学C》👈

前言:

承接上文,继续进行指针和数组的练习。


目录

Part2:指针笔试题 

1.做题

笔试1

笔试2 

笔试3 

笔试4

笔试5

笔试6

笔试7

笔试8

2.总结


Part2:指针笔试题 

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

答案及解析: 

*(a + 1): a表示首元素地址,+1得到第二个元素地址,解引用后得到 2
*(ptr - 1): ptr记录了整个数组下一位的地址,-1后得到数组最后一个元素的地址,解引用后得到5

笔试2 

struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p;
//假设p的值为0x00100000。 如下表表达式的值分别为多少?
//已知:结构体Test类型的变量大小是20个字节
int main()
{
	printf("%p\n", p + 0x1);
	printf("%p\n", (unsigned long)p + 0x1);
	printf("%p\n", (unsigned int*)p + 0x1);
	return 0;
}

答案及解析: 

0x00100014
0x00100001
0x00100004
0x开头,表示十六进制
p + 0x1                    -- p是结构体指针,+1表示加一个结构体的大小(20) 
   0x00100000 
 + 0x00000014 
== 0x00100014

(unsigned long)p + 0x1)    -- p强转为无符号长整型,+1就是+1
   0x00100000 
 + 0x00000001 
== 0x00100001

(unsigned int*)p + 0x1)    -- p强转为整型指针,+1表示跳过一个整型
   0x00100000 
 + 0x00000004 
== 0x00100004

笔试3 

// 小端  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;
}

答案及解析: 

%x 表示以十六进制打印
0x4
0x02000000
int *ptr1 = (int *)(&a + 1);
ptr1[-1]: 即*(ptr1 - 1),&a + 1表示整个数组的下一个位置,强转为整型指针后-1,表示向前跳过一个整型,即数组最后一个元素
int *ptr2 = (int *)((int)a + 1);
*ptr2:

笔试4

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

答案及解析: 

注意逗号表达式,括号内取最后一个值
int a[3][2] = { (0, 1), (2, 3), (4, 5) };
即{1,3,5}
理解: 
 1  3
 5  0
 0  0
a[0] 表示1的地址
p[0] 相当于*(p+0),即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;
}

答案及解析: 

a 是二维数组名,p 是数组指针

p 与 a 指向的首元素相同

下图解释了两者的意义:

由此可以计算出 &p[4][2] - &a[4][2] 的值为 -4 ,按照整型打印就是 -4

按照地址打印,先要看 -4 在内存中是如何存储的:

即 -4 的补码形式:

11111111 11111111 11111111 11111100

换算为十六进制

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 2 3 4 5
6 7 8 9 10

int* ptr1 = (int*)(&aa + 1);    即10的下一个位置的地址
int* ptr2 = (int*)(*(aa + 1));  aa+1表示第二行的地址,解引用得到第二行数组
*(ptr1 - 1)        向前跳过一个整型,即二维数组的最后一个元素10
*(ptr2 - 1)        第二行数组向前跳过一个整型,得到第一行数组的最后一个元素5

 

笔试7

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

答案及解析: 

 

a 是一个存贮字符指针的数组,里面有三个元素,分别指向三个字符串的首字母;

pa 是指针,它指向的数据类型是字符指针;

pa 指向第一个元素 char* a[0];

pa++,跳转到char* a[1],解引用就得到了字符串 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;
}

 

答案及解析: 

 

这是原始状态:

**++cpp:

优先级 ** < ++

cpp++,指向空间c+2 ,一次解引用后得到空间 c+2 ,再次解引用得到 char*[2],指向P,打印出POINT;(cpp已被改变,指向空间c+2)

*-- * ++cpp + 3

先自cpp向左操作,最后+3

cpp++,此时已指向空间c + 1 ,解引用后得到空间c+1,此时--,即空间c+1--,得到空间c,解引用后得到ENTER中第一个E的地址,最后+3,得到ENTER中第二个E的地址,打印出ER;(cpp又被改变,指向空间c + 1 )

*cpp[-2] + 3  即 **(cpp-2) + 3

cpp++,指向空间c + 3,两次解引用得到FIRST中的F的地址,+3,得到其中S的地址,打印出ST; (cpp又被改变,指向空间c + 3 )

cpp[-1][-1] + 1   即 *(*(cpp-1)-1) + 1

cpp-1后解引用,得到空间c+2,-1得到空间c+1,解引用得到NEW中N的地址,+1得到E的地址,打印出EW。 

2.总结

指针+1表示跳过一个类型大小

如:整型指针+1,表示跳过一个整型的大小

一维数组名 a

a表示首元素地址,+1表示第二个元素的地址

&a表示整个数组的地址,+1表示数组末端的地址(数组外)

二维数组名aa

aa表示二维数组中一行数组的地址,+1跳过一行

aa[i] 表示二维数组中第 i 行的地址,+1跳过一行

&aa表示整个二维数组的地址,+1表示二维数组的末端(数组外)

%s传递字符地址,从当前字符开始,打印到 \0 结束 


总结: 

带你做了8道笔试题,有梯度,会第8道,这一部分就掌握的很好了。

码文不易 

如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦  💗💗

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

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

相关文章

无人值守的IDC机房动环综合运维方案

企业数字化转型以及5G、物联网、云计算、人工智能等新业态带动了数据中心的发展&#xff0c;在国家一体化大数据中心及“东数西算”节点布局的推动下&#xff0c;数据中心机房已成为各大企事业单位维持业务正常运营的重要组成部分&#xff0c;网络设备、系统、业务应用数量与日…

远程桌面连接不上解决方法

远程桌面连接是一种方便快捷的技术&#xff0c;可以让用户在不同的设备之间共享桌面和访问远程计算机。然而&#xff0c;有时候我们可能会遇到远程桌面连接无法正常连接的问题。在本篇文章中&#xff0c;我们将详细介绍远程桌面连接无法连接的常见原因&#xff0c;并提供相对应…

chatgpt赋能Python-python3m

Python 3: 一个新时代的编程语言 在编程的世界里&#xff0c;Python 3可能是当前最为热门的编程语言。Python 3是Python语言的最新版本&#xff0c;代码更加现代化&#xff0c;更加简洁易懂&#xff0c;比Python 2更加易于使用。这篇文章将介绍Python 3的各种特性&#xff0c;…

搭建Serv-U FTP服务器共享文件外网远程访问「无公网IP」

文章目录 1. 前言2. 本地FTP搭建2.1 Serv-U下载和安装2.2 Serv-U共享网页测试2.3 Cpolar下载和安装 3. 本地FTP发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转载自内网穿透工具的文章&#xff1a;使用Serv-U搭建FTP服务器并公网访问【内网穿透】 1. 前言…

云贝餐饮连锁V2-2.7.7 【新增】外卖新订单提醒

独立版&#xff1a;云贝餐饮连锁V2、版本更新至2.7.7&#xff0c;小程序、公众号版本&#xff0c;全插件&#xff0c;包含微信公众号小程序&#xff1b;包更新&#xff0c;独立版&#xff1b; 带商家端&#xff0c;修复收银台、排队点餐、堂食点餐&#xff1b;最新版更新了&…

openwrt修改web网页默认端口

使用SSH登录openwrt后台&#xff1b; openwrt 中默认使用的web服务器是uhttpd&#xff0c; 进入配置文件路径&#xff1a; cd /etc/config/ 使用vim编辑器修改uhttpd文件 vi uhttpd 修改以上标红部分后面的端口 vim编辑器打开uhttpd 文件 修改完成后点键盘ESC退出编辑状态&a…

一个胖乎乎的3D卡片(有点像捏扁的圆柱体)

先上效果图&#xff08;图片是随机的&#xff0c;可能你们看到的和这个不一样。但效果是相同的&#xff09;&#xff1a; 再上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Titl…

LitCTF2023 wp re最后一道 cry misc

本来不打算放了&#xff0c;但是比赛打都打了留个纪念社工有佬&#xff0c;与我无关&#xff0c;misc只会隐写虽然我是逆向手&#xff0c;但因为队友tql&#xff0c;所以只留给我最后一道~~我的wp向来以简述思路为主&#xff0c;习惯就好 Crypto Hex&#xff1f;Hex&#xff…

【扰动识别】S变换电能质量扰动识别(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

一年换 3 份工作,在家躺平半年了!

见字如面&#xff0c;我是军哥&#xff01; 还记得&#xff0c;我之前写的这篇《三年换 3 份工作&#xff0c;再也找不到工作了&#xff01;》文章&#xff1f;上周有一位读者在这篇文章下留言&#xff0c;说自己去年一年换了 3 份工作&#xff0c;目前在家躺了半年了&#xff…

[Android Studio Tool]在Android Studio项目中如何使用CSV文件

文章目录 在Android Studio项目中如何使用CSV文件1. 前情提要&#xff1a;CSV文件的准备2. CSV文件在安卓项目一般存放在什么位置&#xff1f;3. Android Studio处理CSV文件的常用插件&#xff1f;4. 怎么调整Android Studio中对GBK编码的CSV文件的处理&#xff1f;以下是一个代…

Nexus私服搭建与使用

文章目录 1 私服简介2 私服安装步骤1:下载解压步骤2:启动Nexus步骤3:浏览器访问步骤4:首次登录重置密码 3 私服仓库分类4 本地仓库访问私服配置步骤1:私服上配置仓库步骤2:配置本地Maven对私服的访问权限步骤3:配置私服的访问路径 5 私服资源上传与下载步骤1:配置工程上传私服的…

现在的00后,真是卷死了呀,辞职信已经写好了·····

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;三月份春招我们公司来了个00后&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪23K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了…

借助TeeChart 图表控件,这家公司轻松创建了可视化图表看板

TeeChart for .NET是优秀的工业4.0 WinForm图表控件&#xff0c;官方独家授权汉化&#xff0c;集功能全面、性能稳定、价格实惠等优势于一体。TeeChart for .NET 中文版还可让您在使用和学习上没有任何语言障碍&#xff0c;至少可以节省30%的开发时间。技术交流Qqun&#xff1a…

冠珠华珍岩板闪现人民日报美好博物馆,彰显民族品牌魅力

行业唯一&#xff01;亮相美好博物馆 一块为中国品牌发声 为了贯彻落实品牌强国战略&#xff0c;展现中国优秀品牌成果&#xff0c;5月10日&#xff0c;值第7个中国品牌日来临之际&#xff0c;由人民日报社特别打造的美好博物馆主题快闪店惊艳亮相上海世博展览中心。 作为连…

理解PMP的顺序

PMP&#xff0c;大量考的是“下一步”、“本应该”的顺序逻辑。在学习的时候&#xff0c;我们需要把整本书十个知识领域&#xff0c;穿起来形成一个线性的结构。 在整理的过程中&#xff0c;很多人都会认为&#xff0c;线性结构&#xff0c;应该是这样的&#xff1a; 每个过程…

如何进行MySQL漏洞扫描

MySQL是一款广泛使用的关系型数据库管理系统&#xff0c;但由于其复杂的结构和功能&#xff0c;也存在不少安全漏洞&#xff0c;容易被黑客攻击。为了解决这些安全问题&#xff0c;进行MySQL漏洞扫描是必要的。那么MySQL怎么进行漏洞扫描?如何进行漏洞扫描?接下来就让小编带大…

Jetpack Compose中的列表控件LazyRow和LazyColumn详解

背景 如果你需要显示大量的条目&#xff08;或一个未知长度的列表&#xff09;&#xff0c;使用像 Column 这样的布局会导致性能问题&#xff0c;因为所有的条目都会被组合和布局&#xff0c;无论它们是否可见。那么&#xff0c;在Compose中有没有像RecycleView的控件可以滑动…

类与对象(中)(一)

1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员 函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器…

chatgpt赋能Python-python3_9_1怎么用

Python3.9.1是什么&#xff1f; Python是一种高级、动态、解释型语言&#xff0c;具有优雅简洁、易于学习和阅读、功能丰富的特点。Python 3.9.1是Python编程语言的一个版本&#xff0c;于2020年12月21日正式发布&#xff0c;是Python 3的最新稳定版本。它包含了许多新的特性、…