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

目录

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

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个字节是一个道理。

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

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

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

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

相关文章

MacOS 文件系统种类及介绍

MacOS 文件系统种类 详细介绍 详细介绍 从图片中我们可以看到一个文件系统选择器的界面,列出了多种不同的文件系统选项。这些文件系统各有其特点和用途,以下是它们之间的主要区别: APFS:Apple File System,是苹果公司为…

移动零 ----双指针

题目链接 题目: 分析: 上述题目, 是将数组分块, 分为前半非零, 后半零, 这种数组分块题我们首先想到双指针 思路: 定义两个指针, 一个cur 一个dest, cur用来遍历数组, dest 指向分界处的第一个零位置, 将数组分块首先让cur 0; dest 0;cur 遍历数组, 如果cur 0, 那么cur…

windows环境下安装Apache

首先apache官网下载地址:http://www.apachelounge.com/download/按照自己的电脑操作系统来安装 这里我安装的是win64 主版本是2.4的apache。 然后解压压缩包到一个全英文的路径下!!!一定一定不要有中文 中文符号也不要有&#xff…

Vue入门到关门之Vue介绍与使用

一、vue框架介绍 1、什么是Vue? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与…

OpenHarmony语言基础类库【@ohos.util.PlainArray (非线性容器PlainArray)】

PlainArray可用于存储具有关联关系的key-value键值对集合,存储元素中key值唯一,key值类型为number类型,每个key对应一个value。 PlainArray依据泛型定义,采用轻量级结构,集合中key值的查找依赖于二分查找算法&#xf…

65、二分-在排序数组中查找元素的第一个和最后一个位置

思路: 寻找数组中的目标值第一个和最后一个,如果不存在哪儿就是返回-1。 第一种方式直接线性遍历,找到目标值记录当前下标。继续寻找下一个不等于目标值,说明下一个目标值的下标就是结尾。直接返回。 第二种方式通过使用二分法…

《HCIP-openEuler实验指导手册》1.7 Apache虚拟主机配置

知识点 配置步骤 需求 域名访问目录test1.com/home/source/test1test2.com/home/source/test2test3.com/home/source/test3 创建配置文件 touch /etc/httpd/conf.d/vhost.conf vim /etc/httpd/conf.d/vhost.conf文件内容如下 <VirtualHost *.81> ServerName test1.c…

基于Python+Selenium的web自动化测试框架详解

简介 随着Web应用程序的广泛应用和不断发展&#xff0c;Web自动化测试已经成为软件质量保证中的一个重要环节。而PythonSelenium作为一组强大的工具和框架&#xff0c;已经成为Web自动化测试领域中的热门技术之一。PythonSelenium可以帮助我们快速、准确地模拟用户行为和操作&…

电脑教程1

一、介绍几个桌面上面的软件 1、火绒&#xff1a;主要用于电脑的安全防护和广告拦截 1.1 广告拦截 1.打开火绒软件点击安全工具 点击弹窗拦截 点击截图拦截 拦截具体的小广告 2、向日葵远程控制&#xff1a;可以通过这个软件进行远程协助 可以自己去了解下 这个软件不要…

BP算法-即误差反向传播法简介

BP算法-即误差反向传播法简介 1986年 反向传播算法&#xff08;back propagation&#xff0c;简称BP模型&#xff09;是1986年由Rumelhart、Hinton和Williams为首的科学家提出的概念&#xff0c;是用于多层神经网络训练的著名算法&#xff0c;有理论依据坚实、推导过程严谨、概…

java spring 07 createBean()(加载class文件,重写方法,实例化前)和doCreateBean()

01.createBean方法 protected Object createBean(String beanName, RootBeanDefinition mbd, Nullable Object[] args)throws BeanCreationException {if (logger.isTraceEnabled()) {logger.trace("Creating instance of bean " beanName "");}RootBea…

面试算法题精讲:最长公共子序列

面试算法题精讲&#xff1a;最长公共子序列 题面 题目来源&#xff1a;1143. 最长公共子序列 题目描述&#xff1a; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列&#xff08;LCS&#xff09;的长度。如果不存在公共子序列 &#xff0c;返回…

C++ ─── 匿名对象+变量的创建顺序

目录 1. 匿名对象&#xff08;临时对象&#xff09; 2. 编译器的优化 3.变量的创建与销毁 1. 匿名对象&#xff08;临时对象&#xff09; 我们先来看有名对象的创建 Date d1; Date d2(2024,4,27);匿名对象的创建 Date(2024,56,1); 生成了一个匿名对象&#xff0c;执行完Da…

MySQL之binlog归档日志

binlog&#xff08;二进制归档日志&#xff09; binlog 二进制日志记录保存所有执行过的修改操作语句&#xff0c;不保存查询操作。如果 MySQL 服务意外停止&#xff0c;可通过二进制日志文件排查&#xff0c;用户操作或表结构操作&#xff0c;从而来恢复数据库数据。启动 bin…

Vue的安装及使用教程【超详细图文教程】

一、安装Node.js 安装步骤详细见Node.js下载安装及环境配置 》https://blog.csdn.net/WHF__/article/details/129362462 二、安装vue ①安装 vue.js&#xff1a; npm install vue -g // -g为全局安装 注意&#xff1a;要以管理员身份运行cmd命令窗口&#xff01;&#xf…

深入浅出MySQL-02-【MySQL支持的数据类型】

文章目录 前言1.数值类型2.日期时间类型3.字符串类型3.1.CHAR和VARCHAR类型3.2.ENUM类型3.3.SET类型 4.JSON类型 前言 环境&#xff1a; Windows11MySQL-8.0.35 1.数值类型 MySQL中的数值类型&#xff0c;如下&#xff1a; 整数类型字节最小值最大值TINYINT1有符号 -128无…

从 Apache Doris 到 SelectDB Cloud:云原生架构下的弹性能力揭秘

随着云时代的到来&#xff0c;越来越多企业开始在公有云、私有云乃至 K8s 容器平台构建实时数据平台。云计算基础设施的革新&#xff0c;促使着数据仓库朝着云原生的方向发展。而用户日益复杂的业务负载和降本增效的需求&#xff0c;对于系统资源的精细化管理和成本效益等方面提…

64、二分-搜索二维矩阵

思路&#xff1a; 通过使用二分方式&#xff0c;对于每行进行二分&#xff0c;因为每行的最后一个数小于下一行的第一个数&#xff0c;我们就可以依次二分。首先取出行数N&#xff0c;然后从0-N进行二分&#xff0c;如果mid最后一个数小于目标值说明0-mid中没有&#xff0c;舍弃…

36 线程概念

本章重点 1.了解线程概念&#xff0c;理解线程与进程的区别与联系 2.学会现充控制&#xff0c;线程创建&#xff0c;线程终止&#xff0c;线程等待 3.了解现场分离与线程安全 4.学会线程同步 5.学会使用互斥量&#xff0c;条件变量&#xff0c;posix信号量&#xff0c;以及读写…

cnpm安装

npm install -g cnpm --registryhttps://registry.npmmirror.com # 注册模块镜像 npm set registry https://registry.npmmirror.com // node-gyp 编译依赖的 node 源码镜像 npm set disturl https://npmmirror.com/dist // 清空缓存 npm cache clean --force // 安装c…