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

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

📋 前言

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

目录
相关文章
|
20天前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
105 14
|
24天前
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
41 8
|
24天前
|
存储 算法 C语言
【C语言】深入浅出:C语言链表的全面解析
链表是一种重要的基础数据结构,适用于频繁的插入和删除操作。通过本篇详细讲解了单链表、双向链表和循环链表的概念和实现,以及各类常用操作的示例代码。掌握链表的使用对于理解更复杂的数据结构和算法具有重要意义。
260 6
|
24天前
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
78 6
|
24天前
|
存储 网络协议 算法
【C语言】进制转换无难事:二进制、十进制、八进制与十六进制的全解析与实例
进制转换是计算机编程中常见的操作。在C语言中,了解如何在不同进制之间转换数据对于处理和显示数据非常重要。本文将详细介绍如何在二进制、十进制、八进制和十六进制之间进行转换。
34 5
|
24天前
|
C语言 开发者
【C语言】断言函数 -《深入解析C语言调试利器 !》
断言(assert)是一种调试工具,用于在程序运行时检查某些条件是否成立。如果条件不成立,断言会触发错误,并通常会终止程序的执行。断言有助于在开发和测试阶段捕捉逻辑错误。
35 5
|
24天前
|
安全 搜索推荐 Unix
【C语言】《回调函数》详细解析
回调函数是指一个通过函数指针调用的函数。它允许将一个函数作为参数传递给另一个函数,并在特定事件发生时执行。这种技术使得编程更加灵活,可以动态决定在何时调用哪个函数。
40 1
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
77 2
|
3天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
3天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

推荐镜像

更多