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

news2024/11/18 0:15:45

 欢迎来到 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道,这一部分就掌握的很好了。

码文不易 

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

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

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

相关文章

硬件系统工程师宝典(24)-----如何能够正确理解三极管?

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。上篇我们说到不同材质的磁珠&#xff0c;频率阻抗特性不同&#xff0c;根据磁珠的频率阻抗特性曲线&#xff0c;磁珠在低频时电感起作用&#xff0c;…

Java开源工具库使用之压测JMeter

文章目录 前言一、概念原理1.1 Jmeter 原理1.2 性能测试术语1.3 web项目性能标准 二、常用元件2.1 线程组2.2 取样器2.3 控制器2.4 定时器2.5 前置/后置处理器2.6 配置元件2.7 监听器 三、插件3.1 第三方插件3.2 录制插件 四、JSR223 脚本及函数4.1 JSR223 脚本4.2 函数变量 五…

职场难题:克服压力、提升自我能力,勇闯职场巅峰

在当今激烈的职场竞争中&#xff0c;职场难题时常出现&#xff0c;如何进行有效沟通、如何应对工作压力、如何提升职业能力等&#xff0c;这些问题都是需要克服的问题。作为一名在职场中求生存&#xff0c;求发展的职业人士&#xff0c;我们必须学会适应这些挑战&#xff0c;掌…

Java基础面试题突击系列1

&#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我不迷路 ❤️《java面试核心知识》突击系列&#xff0c;持续更新… &#x1f490; 面试必知必会学习路线&#xff1a;Java技术栈面试系列SpringCloud项目实战学习路线 &#x1f4dd;再小的收获x365天…

面了个 Java 实习生,小伙很优秀!

大家好&#xff0c;我是鱼皮&#xff0c;前几天给自己的公司面试了一位 Java 暑期实习生&#xff0c;候选人目前是大三。 整个过程我都录屏了&#xff0c;并且在征得候选人的同意后&#xff0c;把面试过程分享出来。一方面是希望对其他在学编程找工作的小伙伴有一些启发和参考…

强化学习代码规划之深度学习预备

现在到了自动编码器和解码器&#xff0c;同样&#xff0c;先练几遍代码&#xff0c;再去理解 import torch import torch.nn as nn import torch.utils.data as Data import torchvision import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matpl…

文心一言和ChatGPT最全对比

文心一言和ChatGPT都是基于深度学习技术的自然语言处理模型&#xff0c;有各自的优势和使用场景&#xff0c;无法简单地比较 ChatGPT 和文心一言哪一个功能更强大&#xff0c;它们各自具有优势和局限性&#xff0c;需要根据具体需求进行选择&#xff0c;以下一些具体对比&#…

HttpRunner 接口自动化测试进阶

这里我们介绍一下通过调试源码的方式来做接口测试&#xff1a; 1、获取源码 github下载或pycharm的git checkout功能去获取&#xff0c;这里直接下载 通过ide打开解压后的源码包 源码包含三层目录结构&#xff1a;docs帮助文档、httprunner核心库、tests自测文件 2、源码结…

小白量化《穿云箭集群量化》(8) 实盘核聚变氢弹策略

小白量化《穿云箭集群量化》&#xff08;8&#xff09; 核聚变策略 上一篇介绍了超级订单SuperOrder功能在股票上买入策略&#xff0c;这篇介绍MetaTrader5期货外汇的双向交易策略。 交易策略比较有名的是马丁策略&#xff0c;马丁策略是单向策略。 我们设计了双向策略原子弹策…

新来的实习生太牛了,还是我们太弱了?...

前几天有个朋友向我哭诉&#xff0c;说她在公司工作&#xff08;软件测试&#xff09;了7年了&#xff0c;却被一个实习生代替了&#xff0c;该何去何从&#xff1f; 这是一个值得深思的问题&#xff0c;作为职场人员&#xff0c;我们确实该思考&#xff0c;我们的工作会被实习…

Qt布局管理器

一、布局管理器 1.1、布局管理器的作用 布局管理器是摆放控件的辅助工具&#xff0c;主要解决组件的位置和大小无法自适应父窗口变化的问题&#xff0c;主要功能如下&#xff1a; 自动调整控件的位置&#xff0c;包括控件之间的间距、对齐等当用户调整窗口大小时&#xff0c;位…

【洛谷】P1404 平均数

【洛谷】P1404 平均数 题目描述 给一个长度为 n n n 的数列&#xff0c;我们需要找出该数列的一个子串&#xff0c;使得子串平均数最大化&#xff0c;并且子串长度 ≥ m \ge m ≥m。 输入格式 第一行两个整数 n n n 和 m m m。 接下来 n n n 行&#xff0c;每行一个整数 …

激光点云3D目标检测算法之CenterPoint

激光点云3D目标检测算法之CenterPoint 本文首发于公众号【DeepDriving】&#xff0c;欢迎关注。 前言 CenterPoint是CVPR 2021的论文《Center-based 3D Object Detection and Tracking》中提出的一个激光点云3D目标检测与跟踪算法框架&#xff0c;与以往算法不同的是&#xff…

一大波特斯拉人形机器人上线,马斯克震撼官宣2款新车!

来源 | 新智源 ID | AI-era 【导读】这次特斯拉股东日&#xff0c;虽没有新车&#xff0c;但马斯克确定Cybertruck今年一定会来。 特斯拉股东日&#xff0c;依旧没有新车。 万众瞩目的马斯克登台继续画饼&#xff0c;「我不官宣新车&#xff0c;不过新车年销量会超过500万」…

【云原生】k8sPod基础概念

k8sPod基础概念 一、Pod概述1、pod概念2、Pod资源限制 二、Pod的两种使用方式三、资源共享1、创建Pod的方式2、Pod功能 四、底层容器Pause1、Pause共享资源2、Pause主要功能3、Pod与Pause结构设计用意 五、镜像的拉取策略1、Pod容器镜像拉取策略2、Pod重启策略 六、容器的分类1…

信息收集-ip地址

1、cdn网络 CDN&#xff08;Content Delivery Network&#xff09;网络是一种分布式网络架构。它通过将内容&#xff08;如网页、图片、视频等&#xff09;缓存到公共的服务器上&#xff0c;以便更快速、更可靠地交付给用户所在的位置。CDN解决了Internet中的一些固有瓶颈和性…

【ROS】Ubuntu22.04安装ROS2(Humble Hawksbill)

0、版本说明 Ubuntu22.04对应的ROS2的版本为Humble Hawksbill&#xff08;ros-humble&#xff09; 如果不是在Ubuntu22.04中安装ROS&#xff0c;请参考下面Ubuntu和ROS的版本对应关系 1、更新apt包列表 $ sudo apt update2、设置编码 将ubuntu环境语言编码设置为en_US en_…

appium自动化测试实战详解及框架搭建

目录 一、Appium的介绍 二、Appium实战&#xff08;以真机为例&#xff09; 一、Appium的介绍 Appium是一款开源的自动化测试工具&#xff0c;其支持iOS和安卓平台上的原生的&#xff0c;基于移动浏览器的&#xff0c;混合的应用。 1、 使用appium进行自动化测试的好…

【C++】容器篇(一)—— vector 的基本概述以及模拟实现

前言&#xff1a; 在之前&#xff0c;我们已经对 string类进行了基本的概述&#xff0c;并且手动的实现了string类中常用的接口函数。本期&#xff0c;我将带领大家学习的是STL库中的一个容器 -- vector 的学习。相比于之前的string类&#xff0c;本期的 vector 相对来说实现起…

CSAPP复习(三)

CH1: 但是如果问什么时候 得到二进制文件 那就是汇编的时候 CH2 sizeof 的返回值是一个无符号数 然后i-D自动默认是一个无符号数 无符号数不能出现负数 所以出现了一个循环 所以永远不可能循环完成。 CH7链接 什么是静态库&#xff1f;使用静态库的优点是什么&#xff1f; …