【C语言进阶篇】 数组常考笔试题万字解析(下)


在这里插入图片描述

🎬 鸽芷咕:个人主页

 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》

⛺️生活的理想,就是为了理想的生活!

文章目录

  • 📋 前言
  • 💬 数组笔试题解析
    • 💭 字符数组笔试题
      • ✅ 字符数组笔试题解析
    • 💭 字符数组笔试题解析 (strlen)
      • ✅ 字符数组(strlen)笔试题解析
    • 💭 字符指针笔试题
      • ✅ 字符指针笔试题解析
    • 💭 字符指针(strlen)笔试题
      • ✅ 字符指针笔试题解析
    • 💭 二维数组笔试题
      • ✅二维数组笔试题解析
  • 💬 指针练习题
  • 📝全篇总结

📋 前言

  🌈hello! 各位宝子们大家好啊,数组和指针系列我们全部讲解完毕了,那么今天就来看一下数组的笔试题!
  ⛳️面试题下章就进阶一些的知识了,会用到字符指针和二维指针嗷,俗话说有难度才有进步呢!大家加油嗷!
  📚本期文章收录在《C语言进阶篇》,大家有兴趣可以看看呐
  ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!

🔥 注:上一章链接在这里《数组笔试题万字解析(上)》

💬 数组笔试题解析

在做数组笔试题之前我们需要明白这俩个点就可以了 数组名的意义:

  1. sizeof (数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
  2. & 数组名 ,这里的数组名表示整个数组,取出的是整个数组的地址。
  3. 除此之外所有的数组名都表示首元素的地址。

💭 字符数组笔试题

诶这里我们就对上次的题目做了改变不在使用单个字符赋值了,而是直接使用字符串进行赋值。

  • 而字符数组使用字符串赋值会在结尾自动补上 \0
  • 这样字符数组的长度就会加 1 ,所以数组的长度就是7
  • 知道了这一点我们下面的题目就变得简单起来了

这里我们使用vs2022 调试看一下:

  • 是不是真的和我们想的是一样存储的
    在这里插入图片描述
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));

✅ 字符数组笔试题解析

printf(“%d\n”, sizeof(arr));
这里计算的是整个数组的大小,而我们字符数组的有 7个字符类型的元素!

  • 所以printf(“%d\n”, sizeof(arr));
  • 的结果为 7

printf(“%d\n”, sizeof(arr+0));
这里arr明显不是整个数组的大小,而arr数组名又是首元素的地址。+0 等于没加吗计算的就还是地址!

  • 既然是地址,那么大小就是 4/8
  • printf(“%d\n”, sizeof(arr+0));
  • 结果为 4/8

printf(“%d\n”, sizeof(*arr));
arr是数组首元素的地址,那么在进行解引用不就是找到数组的第一个元素嘛?而数组的第一个元素是 char 类型的!

  • 所以:printf(“printf(”%d\n", sizeof(*arr));
  • 结果为 1

printf(“%d\n”, sizeof(arr[1]));
这里计算的是 arr 字符数组第二个元素的地址所以:

  • printf(“%d\n”, sizeof(arr[1]));
  • 结果为 1

printf(“%d\n”, sizeof(&arr));
这里取出的肯定是整个数组的地址,而整个数组的地址也是地址

  • 既然是地址,那么大小就是 4/8
  • printf(“%d\n”, sizeof(&arr));
  • 结果为 4/8

printf(“%d\n”, sizeof(&arr+1));
这里取整个数组的地址进行加 1,那么就是指向数组的下一个空间的地址。而下一个空间的地址也是地址。
在这里插入图片描述

  • 既然是地址,那么大小就是 4/8
  • printf(“%d\n”, sizeof(&arr+1));
  • 结果为 4/8

printf(“%d\n”, sizeof(&arr[0]+1));
这里取出数组第一个元素的地址,然后加一指向的就是数组的第二个元素的地址,而数组第二个元素的地址也是地址!
在这里插入图片描述

  • 既然是地址,那么大小就是 4/8
  • printf(“%d\n”, sizeof(&arr[0]+1));
  • 结果为 4/8

💭 字符数组笔试题解析 (strlen)

char arr[] = "abcdef";
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));

✅ 字符数组(strlen)笔试题解析

在做这些面试题之前需要知道 strlen 是干嘛的?strlen 是用来计算字符串长度的

  • 从我们给定地址一直计算到 \0 的位置
  • 找不到 \0 就会一直往后计算字符长度只到找到 \0

printf(“%d\n”, strlen(arr));
这个地方数组是首元素的地址,strlen 是从我们所给定的地址计算一直到 \0, 的长度。这这个字符数组占7个大小,最后一位是 \0

  • 所以:printf(“%d\n”, strlen(arr));
  • 结果为 6

printf(“%d\n”, strlen(arr+0));
这里 arr 还是数组首元素的地址,而加零等于没加,所以传过去的还是指针的首元素地址!

  • 所以:printf(“%d\n”, strlen(arr+0));
  • 结果为 6

printf(“%d\n”, strlen(*arr));
哦豁这里 arr 是首元素地址,而对地址进行解引用。找到到就是字符数组第一个元素的值,strlen需要的是地址我们怎么能给它传值呢?

  • 所以这里程序就崩溃
    在这里插入图片描述

printf(“%d\n”, strlen(arr[1]));
这里也是一样我们传过去的是,字符数组第二哥元素的值!strlen需要的是地址我们怎么能给它传值呢?

  • 所以程序还是会崩溃
    在这里插入图片描述

printf(“%d\n”, strlen(&arr));
这里arr是首元素的地址,等价于&arr。所以我们传过去的还是首元素地址!

  • 所以:printf(“%d\n”, strlen(&arr));
  • 结果为 6

printf(“%d\n”, strlen(&arr+1));
这里arr是元素的地址,首元素的地址 +1 。那么传过去的不就是数组第二个元素的地址。

  • 所以:printf(“%d\n”, strlen(&arr+1));
  • 结果为 5

printf(“%d\n”, strlen(&arr[0]+1));
&arr[0]也是数组第一个元素的地址,加一那么传过去的不就是数组第二个元素的地址。

  • 所以:printf(“%d\n”, strlen(&arr[0]+1));
  • 结果为 5

💭 字符指针笔试题

这里考察就是我们对字符指针的理解了,不知道大家还记得字符指针里面存放的是什么嘛?

  • 字符指针里面存放的是 【 a b c d e f \0】。
  • 这个常量字符串的首地址 a

在这里插入图片描述

char *p = "abcdef";
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p+1));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(&p));
printf("%d\n", sizeof(&p+1));
printf("%d\n", sizeof(&p[0]+1));

✅ 字符指针笔试题解析

printf(“%d\n”, sizeof( p ));
这里p是个指针变量所以指针大小的字节为 结果为 4/8

  • printf(“%d\n”, sizeof( p ));
  • 结果为 4/8

printf(“%d\n”, sizeof(p+1));
这里指针变量 p 存放的是字符串常量首元素的地址。加一传过去的就是字符串常量,第二个元素的地址。

  • 既然是地址,那么大小就是 4/8
  • printf(“%d\n”, sizeof(p+1));
  • 结果为 4/8

printf(“%d\n”, sizeof(*p));
指针变量 p 是字符串常量首元素的地址,那么解引用也就是 字符 a

  • 所以:printf(“%d\n”, sizeof(*p));
  • 结果为 1

printf(“%d\n”, sizeof(p[0]));
p[0] == *(p+0) ==*p,所以跟上题一样要计算的是字符的大小

  • 所以:printf(“%d\n”, sizeof(p[0]));
  • 结果为 1

printf(“%d\n”, sizeof(&p));
取地址 p 取出来依旧是个地址,没有什么不同的!

  • 既然是地址,那么大小就是 4/8
  • printf(“%d\n”, sizeof(&p));
  • 结果为 4/8

printf(“%d\n”, sizeof(&p+1));
取地址 &p 加一,只是跳到p指向的空间,的下一个地址。所以 (&p+1) 传过去的还是地址

  • 既然是地址,那么大小就是 4/8
  • printf(“%d\n”, sizeof(&p+1));
  • 结果为 4/8

printf(“%d\n”, sizeof(&p[0]+1));
取字符串常量的第一个地址 + 1,传过去的是字符串常量的第二个元素 b 的地址

  • 既然是地址,那么大小就是 4/8
  • printf(“%d\n”, sizeof(&p[0]+1));
  • 结果为 4/8

💭 字符指针(strlen)笔试题

char *p = "abcdef";
printf("%d\n", strlen(p));
printf("%d\n", strlen(p+1));
printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));
printf("%d\n", strlen(&p));
printf("%d\n", strlen(&p+1));
printf("%d\n", strlen(&p[0]+1));

✅ 字符指针笔试题解析

printf(“%d\n”, strlen§);
有了开头讲的关于字符指针的描述那就简单多了,字符指针 p 里存放的是字符串常量的首地址。所以传给 strlen 的也是字符串常量的首地址。

  • 所以:printf(“%d\n”, strlen( p ));
  • 结果为 6

printf(“%d\n”, strlen(p+1));
指针p加一就指向了,第二个元素的地址那么计算字符串长度就是从第二个元素开始计算的!

  • 所以:printf(“%d\n”, strlen( p ));
  • 结果为 5

printf(“%d\n”, strlen(*p));
这里还是和前面一样的错误如果对 指针变量进行解引用 那么传过去的就是 指针变量所指向的值 a

  • 所以这里程序会发生崩溃!
    在这里插入图片描述

printf(“%d\n”, strlen(p[0]));
这里还是和前面一样的问题对指针进行下标访问,就会导致传给 strlen() 的是指针p 所指向空间的值!

  • 所以这里程序会发生崩溃!
    在这里插入图片描述

printf(“%d\n”, strlen(&p));
这里取出的指针变量的地址,可是指针变量的地址在哪里我们并不会知道所以这里strlen计算的就是随机值!

  • 所以:printf(“%d\n”, strlen(&p));
  • 结果为 随机值

printf(“%d\n”, strlen(&p+1));
取指针变量p 地址,加一那么传过去的指针变量下一个内存单元里面的地址,而这个地址在哪里我们并不知道!

  • 所以:printf(“%d\n”, strlen(&p+1));
  • 结果为 随机值

printf(“%d\n”, strlen(&p[0]+1));
哦豁!这里就要注意了, [ ] 的优先级比 &取地址操作符优先级高。所以我们p[0]先找到常量字符串 a 这个元素在进行取地址,然后加一找到的是第二个元素的地址。

  • 所以:printf(“%d\n”, strlen(&p[0]+1));
  • 结果为 5

💭 二维数组笔试题

int a[3][4] = {0};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[0][0]));
printf("%d\n",sizeof(a[0]));
printf("%d\n",sizeof(a[0]+1));
printf("%d\n",sizeof(*(a[0]+1)));

✅二维数组笔试题解析

printf(“%d\n”,sizeof(a));
做这种题,我们都做出经验了。只需要先判断 a的类型是什么。他是数组名,又在sizeof()里面单独存在那么 ,sizeof计算的就是整个数组的大小!
在这里插入图片描述

  • printf(“%d\n”,sizeof(a));
  • 结果为 3*4*4 = 48

printf(“%d\n”,sizeof(a[0][0]));
这里二维数组 a[0][0] 是第一排第一列的元素值,而这个二维数组又是整形的:

在这里插入图片描述

  • 所以:printf(“%d\n”,sizeof(a[0][0]));
  • 结果为 4

printf(“%d\n”,sizeof(a[0]));
这里 a[0]这里是第一排数组的的数组名,又是单独出现在sizeof 里面的。而数组名单独出现在sizeof里面计算的就是整个数组的大小!

在这里插入图片描述

  • 所以:printf(“%d\n”,sizeof(a[0]));
  • 结果为 4*4=16

printf(“%d\n”,sizeof(a[0]+1));
a[0] 作为第一行的数组名,没有单独放在sizeof 内部,没有 &a[0] 表示数组首元素的地址,也就是 a[0][0] 的地址所以 a[0]+1 是第一行第二个元素的地址,是地址就是4/8个字节.
在这里插入图片描述

  • 所以:printf(“%d\n”,sizeof(a[0]+1));
  • 结果为 4/8个字节

printf(“%d\n”,sizeof(*(a[0]+1)));
而这里可以这样理解 *() == [ ] 所以 (*(a[0]+1)) == a[0][1] 而这指向的就是二维数组的第一行第二个元素!

在这里插入图片描述

  • 而这个二位数组又是整形的
  • 所以:printf(“%d\n”,sizeof(a[0]+1));
  • 结果为 4 个字节

💬 指针练习题

好了给大家讲解了这么多的数组常考面试题,关看着博主写可没有用啊!俗话说:光听不练假把式 。那么接下来就给大家留点练习题自己练习检验检验把!

📚 代码演示:

#include <stdio.h>
int main()
{int a[3][4] = { 0 };printf("%d\n", sizeof(a + 1));printf("%d\n", sizeof(*(a + 1)));printf("%d\n", sizeof(&a[0] + 1));printf("%d\n", sizeof(*(&a[0] + 1)));printf("%d\n", sizeof(*a));printf("%d\n", sizeof(a[3]));return 0;
}

📝全篇总结

✅ 归纳:

☁️ 好了以上就是关于数组类型笔试题要考察的点全部讲解了,不知道大家对数组和数组名是不是有了新的理解呢?
看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。
在这里插入图片描述

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

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

相关文章

印刷企业如何快速上线MES管理系统解决方案

随着科技的不断发展&#xff0c;印刷行业正面临着前所未有的挑战与机遇。为了提高生产效率、降低成本、提升企业竞争力&#xff0c;许多印刷企业开始引入MES管理系统解决方案。然而&#xff0c;对于很多企业来说&#xff0c;如何快速、有效地上线MES管理系统却是一个难题。本文…

工作流自动化:它是什么,常见示例以及如何实现

由于您的组织旨在留住顶尖人才和高价值客户&#xff0c;因此您需要不断为这两个团队提供一流的体验。 就客户而言&#xff0c;它可以实时解决他们的问题和疑虑&#xff0c;并以深思熟虑、可操作的洞察力主动与他们联系&#xff1b;而且&#xff0c;对于员工来说&#xff0c;它可…

如何解决大模型的「幻觉」问题?

如何解决大模型的「幻觉」问题&#xff1f; 如何解决大模型的「幻觉」问题&#xff1f;幻觉产生原因&#xff1f;模型原因数据层面 幻觉怎么评估&#xff1f;Reference-based&#xff08;基于参考信息&#xff09;基于模型的输入、预先定义的目标输出基于模型的输入 Reference-…

实力强大众和策略:股市跌了债市会涨吗?

股市和债市作为两种大规模的证券商场&#xff0c;它们之间有着怎样的关系&#xff0c;比如说&#xff0c;股市跌了债市会涨吗&#xff1f;关于这个问题&#xff0c;本文将凭借有关常识来展开讨论&#xff0c;为大家提供一个参考思路。 股市跌了债市会涨吗&#xff1f; 从理论上…

【Linux】常用的基本命令指令①

前言&#xff1a;从今天开始&#xff0c;我们逐步的学习Linux中的内容&#xff0c;和一些网络的基本概念&#xff0c;各位一起努力呐&#xff01; &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:数据结构 &#x1f448; &#x1f4af;代码…

Go后端开发 -- Go Modules

Go后端开发 – Go Modules 文章目录 Go后端开发 -- Go Modules一、什么是Go Modules?二、GOPATH的工作模式1.GOPATH模式2.GOPATH模式的弊端 三、Go Modules模式创建项目1.go mod命令2.go mod环境变量3.使用Go Modules初始化项目4.修改模块的版本依赖关系 四、Go Modules下impo…

好用免费的WAF---如何安装雷池社区版

什么是雷池​ 雷池&#xff08;SafeLine&#xff09;是长亭科技耗时近 10 年倾情打造的 WAF&#xff0c;核心检测能力由智能语义分析算法驱动。 Slogan: 不让黑客越雷池半步。 什么是 WAF​ WAF 是 Web Application Firewall 的缩写&#xff0c;也被称为 Web 应用防火墙。 …

【目标检测实验系列】YOLOv5模型改进:融合混合注意力机制CBAM,关注通道和空间特征,助力模型高效涨点!(内含源代码,超详细改进代码流程)

自我介绍&#xff1a;本人硕士期间全程放养&#xff0c;目前成果:一篇北大核心CSCD录用,两篇中科院三区已见刊&#xff0c;一篇中科院四区在投。如何找创新点&#xff0c;如何放养过程厚积薄发&#xff0c;如何写中英论文&#xff0c;找期刊等等。本人后续会以自己实战经验详细…

整合【事务】

目录 1、读未提交&#xff08;脏读&#xff09; 2、读已提交&#xff08;不可重复读&#xff09; 3、可重复读&#xff08;幻读&#xff09; 4、Navicat中模拟开启、提交、回滚事务 1、读未提交&#xff08;脏读&#xff09; 允许一个事务读取其他事务未提交的修改 2、读已…

网络路由跟踪工具

随着企业网络需求的增长&#xff0c;组织发现监控和管理其网络基础设施变得越来越困难。网络管理员正在转向其他工具和资源&#xff0c;这些工具和资源可以使他们的工作更轻松一些&#xff0c;尤其是在故障排除方面。 目前&#xff0c;网络管理员主要使用简单、免费提供的实用…

CMake入门教程【核心篇】添加依赖(add_dependencies)

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 1. 基本用法2. 添加目…

2024年【河北省安全员B证】新版试题及河北省安全员B证模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 河北省安全员B证新版试题参考答案及河北省安全员B证考试试题解析是安全生产模拟考试一点通题库老师及河北省安全员B证操作证已考过的学员汇总&#xff0c;相对有效帮助河北省安全员B证模拟考试题库学员顺利通过考试。…