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

目录

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

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.mzph.cn/web/4237.shtml

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

相关文章

如何在自己的网站页面中嵌入一个【悬浮音乐播放器】

如何嵌入【悬浮音乐播放器】 前言正文1.打开网易云网页版2.设置自己想要的高度和宽度看注意事项 3.选择是否为自动播放4.在header.php文件中</head>标签前插入下面代码5.在heard.php 中<body>标签后边增加一个 div层6.复制播放器代码到\<div>标签的里边7.保存…

sheng的学习笔记-AI-支持向量机(SVM)

目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 目录 什么是向量机 SVM算法原理 SVM基本模型 SVM对偶问题 什么是对偶问题&#xff1a; 为什么使用对偶问题 拉格朗日定理 拉格朗日乘子法 对偶问题算法 非线性SVM算法原理 核函数 常用核函数 软间隔与正则化 软…

链栈的基本操作(链表实现)

目录 定义 我们这篇文章讲的是链栈的实现 链栈的基本操作 定义链栈 初始化栈 判断栈是否为空 入栈 出栈 获取栈顶元素 销毁栈 测试完整代码 定义 栈&#xff08;Stack&#xff09;是一种遵循后进先出&#xff08;LIFO&#xff0c;Last In First Out&#xff09;原则…

开发日志(20240422):一次以为是跨域但并不是跨域的问题排查记录

1. 日志 在前后端联调的时候&#xff0c;遇到了报错&#xff0c;如下图所示&#xff08;现在再看感觉非常简单了&#xff09;&#xff0c;发现前一个请求通过了&#xff0c;但是第二个请求报错&#xff0c;然后看到 strict-origin-when-cross-origin 条件反射的认为是跨域配置…

Java web应用性能分析之【sysbench基准测试】

Java web应用性能分析之【CPU飙高分析之MySQL】-CSDN博客 Java web应用性能分析之【Linux服务器性能监控分析概叙】-CSDN博客 Java web应用性能分析概叙-CSDN博客 Java web应用性能分析之【基准测试】-CSDN博客 上面基本科普了一下基准测试&#xff0c;这里我们将从sysbench…

深入浅出 Transformer

Transformer 背后的核心概念&#xff1a;注意力机制、编码器-解码器架构、多头注意力等等。 一、理解注意力机制 注意力机制能够集中注意力在输入序列的某些部分&#xff0c;同时忽略其他部分&#xff0c;就像我们人类在理解句子时关注特定的单词或短语一样。 自注意力是种特…

眼图仪参数理解和一些测量指标

参考资料&#xff1a; https://www.eet-china.com/mp/a35960.html 一&#xff1a;关于眼图仪&#xff1a; :::warning ●如果追溯历史&#xff0c;大约47年前&#xff0c;眼图就已经开始广泛应用。在1962年-2002的40年间&#xff0c;眼图的测量方法是基于采样示波器的传统方法…

C++默认构造函数的合成

编译器只在编译期需要的时候合成默认构造函数&#xff0c;而不是在用户需要的时候 文章目录 引入编译器合成默认构造函数的四种情况情况一 类中包含带有默认构造函数的类的成员对象情况二 派生类的基类带有默认构造函数情况三 类带有一个虚函数情况四 派生自一个虚基类的类 参考…

Day53|动态规划part14: 1143.最长公共子序列、1035. 不相交的线、53. 最大子序和

1143. 最长公共子序列 这题有点像递增子序列和公共子数组的组合&#xff0c; 要求公共子序列不一定非要是连续的。 确定dp数组下标及其含义 dp[i][j]表示text1[i - 1]与text2[j - 1]结尾的最高公共子序列。 长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的…

Redis 服务等过期策略和内存淘汰策略解析

redis服务是基于内存运行的&#xff0c;所以很多数据都存放在内存中&#xff0c;但是内存又不是无限的&#xff0c;所以redis就引出了key的过期和淘汰策略。 一、Redis的过期策略&#xff1a; 我们在set key的时候&#xff0c;可以给它设置一个过期时间&#xff0c;比如expire …

【神经网络结构可视化】PlotNeuralNet的安装、测试及创建自己的神经网络结构可视化图形

文章目录 前提准备1、下载MikTeX2、下载Git bash3、下载PlotNeuralNet 进行测试1、解压PlotNeuralNet-master.zip2、打开Git bash3、 在my_project中查看生成的pdf文件 创建自己的神经网络结构可视化图形 前提准备 1、下载MikTeX 下载链接&#xff1a; MikTeX ( https://mikt…

【图解计算机网络】TCP协议三次握手与四次挥手

TCP协议三次握手与四次挥手 三次握手流程为什么是三次握手&#xff0c;而不是两次或四次四次挥手流程TIME_WAIT 为什么要等待 2MSL为什么握手是三次&#xff0c;挥手是四次&#xff1f; 三次握手流程 首先是客户端&#xff08;也就是我们的浏览器&#xff09;发送一个SYN标志位…

C++11 数据结构5 队列的概念,队列的顺序存储,实现,测试

一&#xff0c;队列的概念 队列是一种特殊的受限制的线性表。 队列&#xff08;queue&#xff09;是只允许在一端进行插入操作&#xff0c;而在另一端进行删除操作的线性表。 队列是一种先进先出的t&#xff08;First In First Out&#xff09;的线性表&#xff0c;简称FIF…

请编写函数fun,其功能是:将所有大于1小于整数m的非素数存入xx所指数组中,非素数的个数通过k传回。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 请编…

NDK 基础(五)—— C++ 高级特性2

1、左值右值 在 C 中&#xff0c;左值&#xff08;lvalue&#xff09;和右值&#xff08;rvalue&#xff09;是用于描述表达式的术语&#xff0c;它们与赋值操作和内存中对象的生命周期有关。 **左值&#xff08;lvalue&#xff09;**是指可以出现在赋值操作符左侧的表达式&a…

商店数据(九)

目录 65.店铺入驻字段表 66.店铺分类表 67.店铺配置表 68.店铺快递公司关联表 69.店铺资料附加表 70.店铺入驻流程表 71.店铺运费模板表 72.消息类型表 65.店铺入驻字段表 CREATE TABLE wst_bases (id int(11) NOT NULL AUTO_INCREMENT COMMENT 自增id,flowld int(11)…

如何安全进行速卖通自养号测评操作?

对于新加入的卖家而言&#xff0c;进行销量测评显得尤为关键。速卖通平台上的新店往往难以获得活动的扶持&#xff0c;且初始流量相当有限。因此&#xff0c;开店的首要任务便是积极展开测评工作&#xff0c;努力积累初始的评论和销售记录。测评的益处颇为显著&#xff0c;它不…

SpringBoot项目启动,传参有哪些方式?

SpringBoot项目启动&#xff0c;传参有哪些方式&#xff1f; 1.Spring级别的参数 直接在启动 Spring Boot 应用的命令行中使用 -- 后跟参数名和值的方式来传递参数。 记住&#xff1a;一般是对于Spring Boot应用特有的配置参数&#xff0c;确保它们遵循Spring Boot的配置属性命…

【视频打架行为数据集】打斗场景视频数据集简要介绍

一、UBI-Fight&#xff08;异常事件检测数据集&#xff09; 介绍 UBI-Fights 数据集是一个独特的全新大型数据集&#xff0c;涉及特定的异常检测并仍然在打斗场景中提供广泛的多样性&#xff0c;该数据集包含 80 小时的视频&#xff0c;在帧级别进行了完全注释。由 1000 个视…

# 从浅入深 学习 SpringCloud 微服务架构(五)Consul(2)

从浅入深 学习 SpringCloud 微服务架构&#xff08;五&#xff09;Consul&#xff08;2&#xff09; 段子手168 一、consul 集群&#xff1a;consul 集群的基础知识 1、启动 sonsul 服务命令&#xff1a; 以开发者模式快速启动&#xff1a; consul agent -dev -client0.0.0…