【C语言进阶篇】 你真的学会数组了嘛?数组笔试题万字解析(上)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 【C语言进阶篇】 你真的学会数组了嘛?数组笔试题万字解析(上)

📋 前言

  🌈hello! 各位宝子们大家好啊,数组和指针系列我们全部讲解完毕了,那么今天就来看一下数组的笔试题!

  ⛳️本章笔试题主要考察的是数组名和 &数组 的区别,看完本章相信你对数组名和 &数组又会有新的理解!

  📚本期文章收录在《C语言进阶篇》,大家有兴趣可以看看呐

  ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!

💬 数组笔试题解析

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

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

💭 一维数组笔试题

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

✅ 一维数组笔试题解析

printf(“%d\n”,sizeof(a));

这个就很直观了, sizeof (数组名),这里的数组名表示整个数组,计算的是整个数组的大小。

  • 所以printf(“%d\n”,sizeof(a));
  • 结果为16

printf(“%d\n”,sizeof(a+0));

这里大家不要被 sizeof (数组名)给迷糊了,虽然这里是数组名但他是首元素地址,因为指针单独是数组名才是整个元素的地址!

  • 既然是首元素地址,那么就是指针类型的 4 / 8个字节
  • printf(“%d\n”,sizeof(a+0));结果为 4/8

printf(“%d\n”,sizeof(*a));

首先排除 a 是整个数组的大小,因为这里还对a进行解引用了。所以这里的 a 指的是首元素的地址,那么对他进行解引用就找到数组的第一个元素,而数组的第一个元素是整形。

  • 那么printf(“%d\n”,sizeof(*a));
  • 结果为 4个字节

printf(“%d\n”,sizeof(a+1));

也是一样既然不是单纯的数组名,那么a就是首元素地址,首元素地址 +1 就第二个元素的地址。

  • 而第二个元素的地址,也是地址那么就是指针类型的
  • printf(“%d\n”,sizeof(a+1));
  • 结果为 4/8

🔥 注:这里运用了指针的运算不会的可以看看这章《指针的运算》


printf(“%d\n”,sizeof(a[1]));

这里就计算就是数组第一个元素的大小,而数组第一个元素的大小是整形的。

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

printf(“%d\n”,sizeof(&a));

诶这里有人就会犯迷糊了,&取地址 a 取出的是整个数组的地址就会认为是 16,而整个数组的地址也是地址。

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

printf(“%d\n”,sizeof(*&a));

这里其实可以有俩种方法理解:

📜方法一:

&地址取出的是整个数组的地址,但是又进行解引用了。这不就刚好抵消了。

  • sizeof(*&a) == sizeof(a)这里就整个数组的大小了
  • 所以printf(“%d\n”,sizeof(*&a));
  • 结果为 4/8

📜方法二:

&地址取出的是整个数组的地址,但是又进行解引用了之后。拿出的就是整个数组 而这个数组 int a[ ] = {1,2,3,4};是 4 个整形元素那么就 16 个字节

  • 所以printf(“%d\n”,sizeof(*&a));
  • 结果为 4/8

printf(“%d\n”,sizeof(&a+1));

这里我们取出的是整个数组的地址,但是又进行 +1 了。直接跳过整个数组加1 ,但他依旧是个地址。

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

printf(“%d\n”,sizeof(&a[0]));

这里 & 取地址操作符取得数组的一个元素的地址

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

printf(“%d\n”,sizeof(&a[0]+1));

& 取数组的第一个元素的地址 +1 ,那不就取第素组第二个元素的地址嘛?

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

✅ 一维数组笔试题验证

好了笔试题我们分析完了,下面就该来到验证环节了!看一下咱们的分析对还是不对 !

🔥 注:这里的4 或者 8 是指 在32位机器上地址长度为 4 。64位机器上地址长度为 8

📚 代码演示:

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

📑 代码结果:

💭 字符数组笔试题

char arr[] = {'a','b','c','d','e','f'};
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", 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));

✅ 字符数组笔试题解析

printf(“%d\n”, sizeof(arr));

这个和我们前面是一样只不过变成了字符数组,但计算的仍然是整个数组的大小。

  • 所以:printf(“%d\n”, sizeof(arr));
  • 大小为 6

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 是数组首元素那么对其解引用就是找到这个地址里面存放的内容,而这是个字符类型的元素所以:

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

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

这里arr[1]是数组的第二个元素,而数组又是字符类型的所以:

  • 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));

这里取出的是字符数组第一个元素的地址,+1就指向了数组的而二个元素的地址

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

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

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

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

✅ 字符数组(strlen)的考察

printf(“%d\n”, strlen(arr));

因为字符数组arr中没有 \0 ,所以在求字符串长度的时候,会一直往后找,产生的结构就是随机值

  • 因为 strlen 找不到 \0 就会一直往后计算字符长度只到找到 \0
  • 所以printf(“%d\n”, strlen(arr));
  • 是随机值

printf(“%d\n”, strlen(arr+0));

这个情况依旧和前面一样,arr + 0是首元素的地址,和第一个一样,也是随机值

  • 所以printf(“%d\n”, strlen(arr+0));
  • 是随机值

printf(“%d\n”, strlen(*arr));

这里就完全错误了,strlen需要的是地址。而你解引用给我传过来一个元素所以程序一定会崩溃。


printf(“%d\n”, strlen(arr[1]));

这里和前面一样的错误,我们需要的是地址。而你传的却是元素,这时程序就会崩溃!


printf(“%d\n”, strlen(&arr));

这里还是一样的传过去的是字符数组第一个元素的地址,但是没 \0 做为字符结束的标志所以还是随机值。


printf(“%d\n”, strlen(&arr+1));

这里还是一样的传过去的是字符数组第二个元素的地址,但是没 \0 做为字符结束的标志所以还是随机值。


printf(“%d\n”, strlen(&arr[0]+1));

这里还是一样的传过去的是字符数组第二个元素的地址,但是没 \0 做为字符结束的标志所以还是随机值。

📝全篇总结

✅ 归纳:

☁️ 好了以上就是关于数组类型笔试题要考察的点全部讲解了,不知道大家对数组和数组名是不是有了新的理解呢?

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖

拜托拜托这个真的很重要!

你们的点赞就是博主更新最大的动力!

有问题可以评论或者私信呢秒回哦。

目录
打赏
0
0
0
0
32
分享
相关文章
一文彻底搞明白C语言的数组
本文详细介绍了C语言中的数组,包括定义、初始化(静态与动态)、存储方式、访问方法及常用操作,如遍历、修改元素和作为函数参数传递。数组是C语言中最基本的数据结构之一,掌握它对编程至关重要。下篇将介绍二维数组,敬请期待!
35 0
一文彻底搞明白C语言的数组
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
274 6
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
116 5
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
55 29
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
151 2
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。

推荐镜像

更多