数组和指针经典笔试题讲解

目录

创作不易,如对您有帮助,还望一键三连,谢谢!!!

1.sizeof和strlen的对比

1.1sizeof

1.2strlen

1.3sizeof和strlen对比

2.数组笔试题讲解

数组名的理解

2.1一维数组

2.2字符数组

题目一:

题目二:

题目三:

2.3二维数组


创作不易,如对您有帮助,还望一键三连,谢谢!!!

今天我们来讲一些数组和指针经典的笔试题。而在讲解这些题目之前,我们得先来回忆一下sizeof和strlen。

1.sizeof和strlen的对比

1.1sizeof

在学习操作符的时候,我们学习了 sizeof , sizeof 计算变量所占内存内存空间大小的,单位是
字节,如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的大小。

注意:sizeof只关注占用内存的大小,并不关注内存中存放的是什么数据。

我们来看下面这段代码:

这段代码运行结果如下:

这个结果验证了上面我们所说的sizeof只关注占用内存空间的大小,并不关注内存中存放的是什么数据。

1.2strlen

strlen是库函数,使用它要包含string.h头文件。函数原型如下:

size_t(const char*str);

 strlen统计的是所传参数str这个地址开始向后,\0 之前字符串中字符的个数。strlen 函数会⼀直向后找 \0 字符,直到找到为止,所以可能存在越界查找。

这些我们之前都讲过,不在赘述。

1.3sizeof和strlen对比

以上表格总结出来了二者之间的差别,希望大家能熟练掌握。

了解了上面的知识的话,接下来我们先来讲解数组的一些笔试题目

2.数组笔试题讲解

在讲解之前,我们再来回忆一下我们之前所讲的一个知识:

数组名的理解

1. sizeof(数组名),这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩。
2. &数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址。
3. 除此之外所有的数组名都表⽰⾸元素的地址。

不在赘述,我们直接看题。

2.1一维数组

这段代码运行结果是什么呢?

我们一个一个来看:

sizeof(数组名),表示整个数组,计算的是整个数组的大小,故答案为16.

这个也是16吗?不是,我们上面讲的是sizeof(数组名)表示整个数组,前提是括号里面单独跟数组名,但是这个却是a+0,有人会说:这有什么区别呢?根据数学的角度来说这俩完全一样嘛。在数学上,这俩完全一样,

但在这里结果却大不相同:这里没有单独跟数组名,所以此时a表示数组首元素的地址,是个指针,类型是int*类型,a+0还是表示数组首元素的大小,但此时sieof内部是个指针,故sizeof会计算该指针的大小,为4\8.

首先看是否满足单独跟数组名,没有

所以此时a表示数组首元素的地址,是个指针,类型是int*类型,对其解引用得到数组首元素,类型为int,故结果为4\8.

同理,a表示数组首元素地址,是个指针,类型是int*类型,a+1表示数组第二个元素的地址,仍是个指针,所以大小为4\8.

a[1]表示数组第二个元素,类型为int,故答案是4,比较简单。

&a,取出的是整个数组的地址,是个地址,大小仍然为4\8.这里千万不要带着有色眼镜去看,认为整个数组的地址和一个元素的地址不一样!两个都是地址,怎么会不一样呢?只要是地址,大小就是4\8个字节。

这里有两种理解思路:

1.*和&相互抵消掉,所以单独剩下a,表示sizeof(数组名),所以表示整个数组,计算的是整个数组的大小,故答案为16.

2.&a,取出的是整个数组的地址,类型是int(*)[4],是个数组指针,表示指向一个含有 4 个 int 元素的数组的指针。*(&a)对指针解引用,得到整个数组,所以结果是16.

&a,取出了整个数组的地址,&a+1是跳过整个数组后的那个位置的地址,是地址就是4/8个字节,

示意图如下:

 

a[0]表示数组第一个元素,&a[0]得到第一个元素的地址,是个地址,是地址就是4/8个字节。

至此,我们完成了第一道题目,那么接下来我们来看一下字符数组。

2.2字符数组

题目一

我们来一 一讲解。

sizeof(数组名),表示整个数组,计算的是整个数组的大小,故结果是6个字节。比较简单。

与上面我们讲的一维数组的第三个一模一样,arr+0是个地址,是地址大小就是4\8个字节

没有满足sizeof(数组名)和&数组名,所以此时arr表示数组首元素的地址,类型为char*,对其解引用访问到数组第一个元素,大小为1个字节

计算数组第二个元素大小,为1个字节

&arr取出的是整个数组的地址,但是还是个地址,是地址大小就是4\8个字节

&arr+1, 跳过整个数组,指向了数组后边的空间,4/8个字节

第二个元素的地址,是地址就是4/8字节

题目二:

这段代码运行结果又是如何呢?首先看到这段代码,我们就应该看到:arr数组这种初始化方式,数组末尾没有\0,有可能会引发strlen的越界访问。

答案和讲解如下图所示:

题目三:

答案直接给出,和我们上面讲解的题目非常相似,这里就不在赘述。

相对于题目二来说,这个arr数组的初始化方式,会在数组末尾总添加一个\0,题目解析如下图所示:

这里唯一需要注意的是:

&arr得到的是整个数组的地址,类型为char(*)[6],加一跳过整个数组。

接下来,我们来看最后一道题目,有关二维数组的题目。

2.3二维数组

这道题目还是有一定难度的,是我们今天学习的最难的一道题目,我们来一个一个讲解:

sizeof(数组名),表示整个数组,计算的是整个二维数组的大小,结果为48个字节

a[0][0]表示数组第一个元素,大小为4个字节,没什么好讲的。

仔细看这个题目,a[0]表示的是什么呢?a[0]是数组名吗?

我们来回忆一下二维数组:

对于一个二维数组int a[3][4],它的类型是int[3][4],sizeof(数组名)和&数组名表示整个二维数组,而sizeof(a[0])和&a[0]表示的是第0行的整行数组,也就是说a[0]也相当于数组名,只不过它是第0行的数组名。

所以在这里sizeof(a[0])表示的是第一行数组,计算的是数组第一行的大小,结果为16个字节。

此时sizeof没单独跟a[0],a[0]表示数组首元素的地址,a[0]+1表示数组第二个元素的地址,结果为4\8个字节

此时sizeof没单独跟a[0],a[0]表示数组首元素,a[0]+1表示数组第二个元素,在对其解引用得到第二个元素,结果是4个字节。

来看这一组,此时a不是上面所说的两种情况,表示的是二维数组首元素的地址,也就是二维数组第一行的地址(这里要能和a[0]+1作区分),a+1表示第二行的地址,是个地址,结果为4\8个字节;而8对其进行了解引用,得到了数组第二行的元素,故结果为16个字节。

这一组,&a[0]就是&加上第一行的数组名,得到的是第一行的地址,加一跳过一行,得到第二行的地址,是个地址结果为4\8个字节

10对&a[0]+1进行了解引用操作,得到了第二行的元素,故结果为16个字节。

a作为数组名并没有单独放在sizeof内部,a表示数组首元素的地址,是二维数组首元素的地址,也就是第一行的地址,*a就是第一行,计算的就是第一行的大小,16字节

a[3]细心的小伙伴一看,a数组不是只有三行,最多也就是a[2]吗?a[3]是什么鬼。

确实是这样,a[3]不属于数组a,但a[3]无需真实存在

我们上面讲sizeof时就说过sizeof只关心所占内存大小,不关心里面所放数据,sizeof仅仅通过类型的推断就能算出长度a[3]是第四行的数组名,单独放在sizeof内部,计算的是第四行的大小,16个字节。

这与sizeof(int)和sizeof(3+4)结果都是4个字节是一个道理。

至此,我们讲完了数组一些经典的笔试题目,相信大家学完后肯定会对数组有更加深刻的理解。

至于指针的笔试题讲解,我们放到下篇来讲。

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

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

相关文章

【skill】usbwebserver的几个问题

试了几个云服务器(华为云、移动10086云),使用usbwebserver均会出现问题。 以前都是找缺少的对应的dll文件,不仅搜索半天、解压、移动复制、同时还要考虑文件的位数 有人说C:\Windows\System32存放的是64位的东西有人说C:\Windows…

Axure设计美观友好的后台框架页

使用Axure设计后台框架页 优点介绍: **1、使用中继器灵活配置菜单项; 2、二级菜单面板跟随一级菜单位置显示; 3、菜单链接打开后,联动添加tab标签; 4、标签页与iframe内容联动,可关闭; 5、左侧…

车道分割YOLOV8-SEG

车道分割YOLOV8-SEG,训练得到PT模型,然后转换成ONNX,OPENCV的DNN调用,支持C,PYTHON,ANDROID开发 车道分割YOLOV8-SEG

Xline中区间树实现小结

Table of Contents 实现区间树的起因区间树实现简介 插入/删除查询重叠操作使用Safe Rust实现区间树 问题Rc<RefCell<T>> i. 线程安全问题其他智能指针 i. Arc<Mutex<T>>? ii. QCell数组模拟指针总结 01、实现区间树的起因 在Xline最近的一次重构中…

苍穹外卖学习笔记(8.用户端历史订单模块,商家端订单管理模块)

目录 一、商家端订单管理模块1、查看历史订单2、查询订单详情3、取消订单4、再来一单5、代码开发6、测试 二、用户端历史订单模块1、订单搜索2、各个状态的订单数量统计3、查询订单详情4、接单5、拒单6、取消订单7、派送订单8、完成订单9、代码开发10、测试 三、校验收货地址是…

逆向案例二十九——复杂扣代码,七某数据(一)

网址&#xff1a;aHR0cHM6Ly93d3cucWltYWkuY24vcmFuaw 抓包分析载荷中有加密参数analysis&#xff1a; 获取数据代码&#xff0c;经过分析&#xff0c;发现analysis确实是校验参数cai&#xff1a; import requestscookies {qm_check: A1sdRUIQChtxen8pI0dAMRcOUFseEHBeQF0JT…

31.Gateway网关-跨域问题

跨域 1.域名不同&#xff1a;www.baidu.com和www.taobao.com,www.taobao.org 2.域名相同&#xff0c;端口不同。localhost:8080和localhost:8081 跨域问题 浏览器禁止请求的发起者与服务端发生跨域ajax请求&#xff0c;请求被浏览器拦截的问题。 解决方案 CORS 浏览器询…

安全开发实战(2)---域名反查IP

目录 安全开发专栏 前言 域名与ip的关系 域名反查ip的作用 1.2.1 One 1.2.2 Two 1.2.3 批量监测 ​总结 安全开发专栏 安全开发实战http://t.csdnimg.cn/25N7H 这步是比较关键的一步,一般进行cdn监测后,获取到真实ip地址后,或是域名时,然后进行域名反查IP地址,进行进…

PySide6 GUI 学习笔记——Python文件编译打包

前面编写的软件工具都必须运行在Python环境中&#xff0c;且通过命令行的方式运行&#xff0c;通过Python打包工具&#xff0c;我们可以把.py文件封装成对应平台的运行文件&#xff0c;供用户执行。 常见Python打包工具 工具简介官网/文档地址py2exe将Python脚本转换为Window…

速卖通自养号测评:如何规避安全风险?

对于初涉电商领域的新卖家而言&#xff0c;进行销量测评显得尤为关键。由于速卖通新店铺往往难以获得平台活动的支持&#xff0c;流量也相对匮乏&#xff0c;因此&#xff0c;开店的首要任务便是进行测评&#xff0c;通过积累一定的评论和销售数据。 测评的益处颇多&#xff0…

【大语言模型LLM】- Meta开源推出的新一代大语言模型 Llama 3

&#x1f525;博客主页&#xff1a;西瓜WiFi &#x1f3a5;系列专栏&#xff1a;《大语言模型》 很多非常有趣的模型&#xff0c;值得收藏&#xff0c;满足大家的收集癖&#xff01; 如果觉得有用&#xff0c;请三连&#x1f44d;⭐❤️&#xff0c;谢谢&#xff01; 长期不…

Unity对应的c#版本

本文主要是记录一下unity已经开始兼容c#的版本和.net版本&#xff0c;以便更好的利用c#的特性。 c#和.net对应情况 微软已经将.net开发到.net 9了&#xff0c;但是unity的迭代速度远没有c#迭代速度快&#xff0c;已知unity最新的LTS版本unity2023已经兼容了c#9 可以在unity手册…

【深度学习】yolo-World,数据标注,zeroshot,目标检测

仓库&#xff1a;https://github.com/AILab-CVC/YOLO-World 下载权重&#xff1a; 仓库下载和环境设置 下载仓库&#xff1a;使用以下命令从 GitHub 上克隆仓库&#xff1a; git clone --recursive https://github.com/AILab-CVC/YOLO-World.git创建并激活环境&#xff1a…

网络安全新挑战:通用人工智能(AGI)等级保护指南

通用人工智能&#xff08;AGI&#xff09;的发展现状及趋势 随着2023年大语言模型应用的划时代突破&#xff0c;以ChatGPT为杰出代表的此类技术犹如一股洪流&#xff0c;彻底颠覆了人类与机器智能交互的疆界&#xff0c;引领通用人工智能&#xff08;AGI&#xff09;步入一个崭…

【继承和多态】

闭上眼睛&#xff0c;什么都不听.............................................................................................................. 文章目录 前言 一、【继承】 1.1【继承的概念】 1.2【 继承的定义】 1.2.1【定义格式】 1.2.2【继承关系和访问限定符】 1.2…

回归预测 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现SA-BP模拟退火算法优化BP神经网络多变量回归预测&#xff0…

OGG extract进程占据大量虚拟内存导致服务器内存异常增长分析

现象 oracle服务器一节点内存&#xff0c;一个月来持续升高&#xff0c;近一月上涨10%左右。 问题分析 OS内存使用情况 使用内存最大的10个进程如下&#xff0c;PID为279417占用最大的内存。 查询279417&#xff0c;发现是ogg相关进程。 发现ogg的extract进程占用了大量的虚拟内…

27 - 数据传送指令

---- 整理自B站UP主 踌躇月光 的视频 文章目录 1. CPU 电路2. 数据传送指令的几种情况3. 实验工程4. 实验结果 1. CPU 电路 2. 数据传送指令的几种情况 # program.asm; 1. ; MOV A, 5;; 2. ; MOV A, B;; 3. ; MOV A, [5];; 4. ; MOV B, 6 ; MOV A, [B]; 5. ; MOV [0x2f], 5;; …

Apache RocketMQ ACL 2.0 全新升级

作者&#xff1a;徒钟 引言 RocketMQ 作为一款流行的分布式消息中间件&#xff0c;被广泛应用于各种大型分布式系统和微服务中&#xff0c;承担着异步通信、系统解耦、削峰填谷和消息通知等重要的角色。随着技术的演进和业务规模的扩大&#xff0c;安全相关的挑战日益突出&am…

为AI电脑生态注入强悍动力,安耐美PlatiGemini 1200W高性能电源

在DIY攒机的过程中&#xff0c;电源是非常重要的一环&#xff0c;现在高性能的硬件功耗往往很高&#xff0c;因此一款优秀的电源整个系统稳定运行的基石。最近&#xff0c;我发现一款由安耐美&#xff08;Enermax&#xff09;推出的PlatiGemini 1200W电源&#xff0c;它不仅满足…