当前位置: 首页 > news >正文

面试速通宝典——11

188. 总结static的应用和作用

  1. 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。
  2. 在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其他函数访问。
  3. 在模块内的static函数只可被这一模块的其他函数调用,这个函数的适用范围被限制在声明它的模块内。
  4. 在类中的static成员变量属于整个类所拥有,对类的对象只有一份拷贝
  5. 在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。

189. 总结const的应用和作用

  1. 阻止一个变量被改变,可以使用const关键字。在定义const变量时,通常需要对它初始化,因为以后就没有机会去改变他了。
  2. 对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const。
  3. 在一个函数声明中,const可以修饰形参,表明他是一个输入参数,在函数内部不能改变其值
  4. 对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量
  5. 对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。

190. 什么是指针?谈谈你对指针的理解。

  1. 指针是一个变量,该变量专门存放内存地址。
  2. 指针变量的类型取决于其指向的数据类型,在所指数据类型前加*。
  3. 指针变量的特点是他可以访问所指向的内存

191. 什么是常指针?什么是指向常变量的指针?

‌‌‌‌  常指针的含义是该指针所指向的地址不能改变,但该地址所指向的内容可以变化,使用常指针可以保证我们的指针不能指向其他变量。

‌‌‌‌  指向常变量的指针是指该指针的变量本身的地址可以发生变化,可以指向其他的变量,但是他所指的内容不可以被修改

192. 函数指针和指针函数的区别?

‌‌‌‌  函数指针指向一个函数入口的指针
‌‌‌‌  指针函数函数的返回值是一个指针类型

193. 简述Debug版本和Release版本的区别?

‌‌‌‌  Debug版本是调试版本Release版本是发布给用户的最终非调试版本

194. 指针的几种典型应用情况

  1. int *p[n] —— 指针数组,每个元素均为指向整形数据的指针。
  2. int (*)p[n]——p为指向一维数组的指针,这个一维数组有n个整型数据。
  3. int *p()——函数带回指针,指针指向返回的值。
  4. int (*)p()——p为指向函数的指针。

195. static函数与普通函数有什么区别?

‌‌‌‌  static函数在内存中只有一份普通函数在每个被调用中维持一份拷贝

196. struct(结构)和union(联合)的区别?

  1. struct union 都是由多youdao个不同的数据类型的成员组成但在任何同一时刻联合中只存放了一个被选中的成员所有成员共用一块地址空间),而结构的所有成员都存在(不同成员的存放地址不同)
  2. 对于 union 的不同成员赋值,将会对其他成员重写,原来成员的值就不存在了,而对于结构的不同成员赋值时互不影响的。

解释

结构体 (struct)

  1. 存储:结构体中的所有成员都有自己的独立存储空间。每个成员的地址相对于结构体变量的基地址是固定的,并且所有成员可以同时存在。
  2. 成员访问:访问结构体的不同成员之间互不影响。例如,如果你向一个成员赋值,这个操作不会影响其他成员的值。
#include <stdio.h>struct ExampleStruct {int integer;float decimal;char character;
};int main() {struct ExampleStruct s;s.integer = 10;s.decimal = 3.14;s.character = 'A';printf("integer: %d\n", s.integer);       // 输出: integer: 10printf("decimal: %f\n", s.decimal);       // 输出: decimal: 3.140000printf("character: %c\n", s.character);   // 输出: character: Areturn 0;
}

‌‌‌‌  在这个例子中,ExampleStruct 结构体中的三个成员 integerdecimal 和 character 拥有独立的存储空间,互不影响。

联合体 (union)

  1. 存储:联合体的所有成员共享同一块存储空间。这意味着在任何给定时间,联合体只能存储其中一个成员的值。联合体的大小是它最大成员的大小
  2. 成员访问:当你给联合体的一个成员赋值时,这个值会影响其他成员,因为所有成员共享同一块存储空间。仅最后赋的值会被保存。
#include <stdio.h>union ExampleUnion {int integer;float decimal;char character;
};int main() {union ExampleUnion u;u.integer = 10;printf("integer: %d\n", u.integer);       // 输出: integer: 10u.decimal = 3.14;printf("decimal: %f\n", u.decimal);       // 输出: decimal: 3.140000printf("integer: %d\n", u.integer);       // 可能会输出一个不可预测的值,因为它已经被覆盖printf("character: %c\n", u.character);   // 可能会输出随机字符,因为它已经被覆盖u.character = 'A';printf("character: %c\n", u.character);   // 输出: character: Aprintf("decimal: %f\n", u.decimal);       // 可能会输出一个不可预测的值,因为它已经被覆盖return 0;
}

‌‌‌‌  在这个例子中,ExampleUnion 联合体中的三个成员 integerdecimal 和 character 共享同一个存储空间。当你改变其中一个成员的值时,其他成员的值会被覆盖且不可预测。

关键区别总结:

  1. 存储空间

    • struct 中每个成员都有自己独立的存储空间,因此可以同时存在。
    • union 中所有成员共享同一个存储空间,因此在任何一个时间点只能存储一个成员的值。
  2. 成员间的关系

    • 在 struct 中,修改一个成员的值不会影响其他成员。
    • 在 union 中,修改一个成员的值会影响其他成员,因为所有成员存储在同一块内存中。
  3. 用途

    • struct 通常用于需要同时保存多个不同类型的数据的场景。
    • union 通常用于需要在不同时间存储不同类型但不需要同时保存不同类型数据的场景,例如保存一个值的不同视图或表示方式。

扩展理解:

  • 大小

    • 一个 struct 的大小是所有成员大小之和,可能还包括内存对齐导致的间隙。
    • 一个 union 的大小是其最大成员的大小,因为所有成员共用一块内存。
  • 内存对齐

    • 结构体成员是按照定义顺序排列的,通常需要考虑内存对齐的问题以提高访问效率。
    • 联合体的所有成员从同一内存地址开始,不存在内存对齐间隙的问题。

197. class 和 struct 的区别?

‌‌‌‌  struct 的成员默认是公有的,而类的成员默认是私有的

198. 简述枚举类型

‌‌‌‌  枚举方便一次定义一组常量,使用起来很方便。

解释

简述

‌‌‌‌  枚举类型,是编程语言(如C、C++、Java, Python等)中的一种数据类型,允许开发者定义一组命名的整数常量。这些常量被称为枚举成员,每个枚举成员隐式地对应一个整数值。

解释

  • 定义固定值:枚举方便一次定义一组相关的常量,类似于有意义的标签,便于代码的阅读和维护。
  • 提高代码可读性:使用枚举可以避免魔法数(magic numbers),这些常量在代码中有清晰的名称,增强了可读性和可维护性。
  • 便于管理:集中管理这些常量,增加新值或修改现有值时,只需在枚举定义中进行修改,减少了疏漏和出错的机会。

示例

C 语言
#include <stdio.h>// 定义一个枚举类型
enum Day {SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY
};int main() {enum Day today = WEDNESDAY;printf("Today is: %d\n", today);  // 输出: Today is: 3return 0;
}

‌‌‌‌  在这个例子中, Day 枚举定义了一个一周的天数,每个枚举成员都隐式地被赋值为一个整数,从0开始(SUNDAY是0,MONDAY是1,依次类推)。

Java 语言
public class EnumExample {// 定义一个枚举类型enum Day {SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY}public static void main(String[] args) {Day today = Day.WEDNESDAY;System.out.println("Today is: " + today);  // 输出: Today is: WEDNESDAY}
}

‌‌‌‌  Java 的枚举更加强大,它不仅仅是整数常量,还可以定义字段、方法等,像类一样使用。

补充

  1. 默认值与自定义值
    • 在C语言中,枚举成员从0开始递增,你也可以手动为枚举成员指定值。例如:
     enum Day {SUNDAY = 1,MONDAY,TUESDAY = 5,WEDNESDAY,THURSDAY,FRIDAY = 10,SATURDAY};// MONDAY = 2, WEDNESDAY = 6, THURSDAY = 7, SATURDAY = 11
  • 在这种情况下,后续未指定值的成员将按之前的值递增。
  1. 作用域与类型安全

    • 在 C 语言中,枚举成员在编译时期被替换为整数值,具有相同作用域但不严格的类型检查。
    • 在 Java 中,枚举是一个真正的类类型,具有类型安全和严格的作用域管理。
  2. 扩展功能

    • 高级语言中的枚举(如 Java 和 C#)可以包含字段、方法,可以实现接口。
    • 可以为枚举添加构造函数、属性以及方法,甚至使用枚举实现一些设计模式,如单例模式。
  3. 应用场景

    • 枚举常用于定义一组相关但有限的常量值集,如一周的天数、月份、状态码、颜色等等。
    • 在状态机实现、资源标识(如HTTP状态码)等需要预定义一组固定值的地方,枚举是一种非常方便的选择。

总结

‌‌‌‌  枚举类型是一种便捷的方式来定义常量集合,便于后续代码的使用、维护和阅读。通过使用枚举,能有效避免魔法数,提高程序的可读性和可靠性,并在一定程度上帮助实现类型安全。

‌‌‌‌  这里 , “魔法数”(magic number)在编程中指的是直接在代码中使用的具体数字常量,这些数字通常没有明显的意义或解释。使用魔法数会降低代码的可读性和可维护性,因为它们不直观,不能清晰地表达其在程序中的作用或含义。

魔法数的例子

假设有一段代码如下:

int calculateBonus(int level) {if (level == 1) {return 500;} else if (level == 2) {return 1000;} else if (level == 3) {return 1500;}return 0;
}

‌‌‌‌  在这段代码中,12350010001500 都是魔法数。它们的含义不清晰,读者无法通过代码直接了解这些数字的具体意义。

使用枚举和常量来避免魔法数

‌‌‌‌  通过使用枚举和常量,可以提高代码的可读性和可维护性。重写上述代码,使用枚举类型和常量:

enum Level {BEGINNER = 1,INTERMEDIATE = 2,ADVANCED = 3
};const int BEGINNER_BONUS = 500;
const int INTERMEDIATE_BONUS = 1000;
const int ADVANCED_BONUS = 1500;int calculateBonus(Level level) {switch(level) {case BEGINNER:return BEGINNER_BONUS;case INTERMEDIATE:return INTERMEDIATE_BONUS;case ADVANCED:return ADVANCED_BONUS;default:return 0;}
}

好处

  1. 可读性

    • 通过使用有意义的枚举值和常量名,代码更加直观,读者能够轻松理解每个值的含义。
  2. 可维护性

    • 如果需要修改某个值,只需更改定义处即可,减少了出错的可能性。
  3. 类型安全

    • 枚举类型提供了一定程度的类型检查,减少了将无效值传递给函数的风险。
  4. 避免重复

    • 避免了在多个地方重复使用相同的魔法数,使代码更干净、更一致。

总结

‌‌‌‌  魔法数是直接在代码中使用的具体数字常量,通常没有明显的解释或含义。通过使用枚举类型和常量,可以有效避免魔法数,提高代码的可读性、可维护性和类型安全性。这是一种良好的编程实践,能够使代码更加清晰、易懂和易于管理。

199. assert()的作用?

‌‌‌‌  assert() 是一个调试程序时经常使用的宏在程序运行时他计算括号内的表达式,如果表达式为False(0),程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。

‌‌‌‌  这个宏通常用来判断程序中是否出现了明显的非法数据,如果出现了终止程序以免导致更严重的后果,同时也便于查找错误。

相关文章:

面试速通宝典——11

188. 总结static的应用和作用 函数体内static变量的作用范围为该函数体&#xff0c;不同于auto变量&#xff0c;该变量的内存只被分配一次&#xff0c;因此其值在下次调用时仍维持上次的值。在模块内的static全局变量可以被模块内所用函数访问&#xff0c;但不能被模块外其他函…...

python:reportlab 将多个图片合并成一个PDF文件

承上一篇&#xff1a;java&#xff1a;pdfbox 3.0 去除扫描版PDF中文本水印 # 导出扫描版PDF文件中每页的图片文件 java -jar pdfbox-app-3.0.3.jar export:images -prefixtest -i your_book.pdf 导出 Writing image: test-1.jpg Writing image: test-2.jpg Writing image: t…...

决策树:机器学习中的强大工具

什么是决策树&#xff1f; 决策树是一种通过树状结构进行决策的模型。它的每个节点代表一个特征&#xff08;或属性&#xff09;&#xff0c;每个分支代表特征的可能值&#xff0c;而每个叶子节点则代表最终的决策结果或分类。想象一下&#xff0c;在选择晚餐时&#xff0c;你…...

平面电磁波(解麦克斯韦方程)电场相位是复数的积分常数,电场矢量每个分量都有一个相位。磁场相位和电场一样,这是因为无损介质中实数的波阻抗

注意无源代表你立方程那个点xyzt处没有源&#xff0c;电场磁场也是这个点的。 j电流面密度&#xff0c;电流除以单位面积&#xff0c;ρ电荷体密度&#xff0c;电荷除以单位体积。 j方程组有16个未知数&#xff0c;每个矢量有三个xyz分量&#xff0c;即三个未知数&#xff0c;…...

复习HTML(进阶)

前言 上一篇的最后我介绍了在表单中&#xff0c;上传文件需要使用到 method属性 和enctype属性。本篇博客主要是详细的介绍这些知识 <form action"http://localhost:8080/test" method"post" enctype"multipart/form-data"> method属性…...

Qt 每日面试题 -7

61、如何安全的在另外一个线程中调用QObject对象的接口 QObject被设计成在一个单线程中创建与使用&#xff0c;因此&#xff0c;在一个线程中创建一个对象&#xff0c;而在另外的线程中调用它的函数&#xff0c;这样的行为不能保证工作良好。使用信号槽的队列连接或者QT的反射…...

《计算机原理与系统结构》学习系列——计算机的算数运算(下)

系列文章目录 目录 浮点数的表示和运算浮点数的表示浮点数的规格化浮点数标准IEEE754浮点数表示范围浮点数的转换浮点数的运算浮点数加法浮点数加法的硬件实现 精度浮点乘法浮点运算硬件 MIPS中的浮点指令 浮点数的表示和运算 浮点数的表示 表达非整型的数 可以表达很小和很大…...

二叉树进阶学习——从前序和中序遍历序列构造二叉树

1.题目解析 题目来源&#xff1a;105.从前序与中序遍历序列构造二叉树——力扣 测试用例 2.算法原理 首先要了解一个概念 前序遍历&#xff1a;按照 根节点->左子树->右子树的顺序遍历二叉树 中序遍历&#xff1a;按照 左子树->根节点->右子树的顺序遍历二叉树 题目…...

【数据分享】2000—2023年我国省市县三级逐年植被覆盖度(FVC)数据(Shp/Excel格式)

之前我们分享过2000—2023年逐月植被覆盖度&#xff08;FVC&#xff09;栅格数据&#xff08;可查看之前的文章获悉详情&#xff09;和Excel和Shp格式的省市县三级逐月FVC数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff0c;原始的逐月栅格数据来源于高吉喜学者…...

【Python】Streamlit:为数据科学与机器学习打造的简易应用框架

Streamlit 是一个开源的 Python 库&#xff0c;专为数据科学家和机器学习开发者设计&#xff0c;旨在快速构建数据应用。通过简单的 Python 脚本&#xff0c;开发者无需掌握前端技术&#xff0c;即可将数据分析和模型结果转化为直观、交互式的 Web 应用。其简洁的 API 设计使得…...

OpenJudge | 置换选择排序

总时间限制: 1000ms 内存限制: 65536kB 描述 给定初始整数顺串&#xff0c;以及大小固定并且初始元素已知的二叉最小堆&#xff08;为完全二叉树或类似完全二叉树&#xff0c;且父元素键值总小于等于任何一个子结点的键值&#xff09;&#xff0c;要求利用堆实现置换选择排序&a…...

如何提取b站的视频字幕,下载视频

打开视频地址 按F12打开—开发者工具 在开发者工具打开Network 过滤器关键字&#xff1a; 自动生成字幕&#xff1a;ai_subtitle 自制&#xff1a;json 打开/关闭字幕 刷新页面 找到字幕 点选字幕的respond 将方框中的内容复制&#xff1b; 复制到&#xff1a;https://www.drea…...

Vue中使用ECharts实现热力图的详细教程

在数据可视化领域&#xff0c;热力图是一种非常直观的表现形式&#xff0c;它通过颜色深浅来展示数据分布情况。在Vue项目中&#xff0c;我们可以使用ECharts这一强大的图表库来实现热力图。下面我将详细介绍如何在Vue中使用ECharts实现热力图。效果如下图&#xff1a; 一、准备…...

Arduino UNO R3自学笔记13 之 Arduino使用LM35如何测量温度?

注意&#xff1a;学习和写作过程中&#xff0c;部分资料搜集于互联网&#xff0c;如有侵权请联系删除。 前言&#xff1a;学习使用传感器测温。 1.LM35介绍 一般来讲当知道需求&#xff0c;就可以 通过既定要求的条件来筛选需要的器件&#xff0c;多方面的因素最终选定了器件…...

蓝桥杯【物联网】零基础到国奖之路:十六. 扩展模块之矩阵按键

蓝桥杯【物联网】零基础到国奖之路:十六. 扩展模块之矩阵按键 第一节 硬件解读第二节 CubeMX配置第三节 MDK代码 第一节 硬件解读 扩展模块和ADC模块是一摸一样的&#xff0c;插在主板上。 引脚对应关系&#xff1a; PB6-ROW1 PB7-ROW2 PB1-COLUMN1 PB0-COLUMN2 PA8-COLUMN3 …...

Apollo9.0 Planning2.0决策规划算法代码详细解析 (4): PlanningComponent::Proc()

&#x1f31f; 面向自动驾驶规划算法工程师的专属指南 &#x1f31f; 欢迎来到《Apollo9.0 Planning2.0决策规划算法代码详细解析》专栏&#xff01;本专栏专为自动驾驶规划算法工程师量身打造&#xff0c;旨在通过深入剖析Apollo9.0开源自动驾驶软件栈中的Planning2.0模块&am…...

AAA Redis的过期删除策略+缓存雪崩+缓存一致性问题

目录 一、三种删除策略比较 二、缓存雪崩缓存击穿缓存穿透 三、缓存一致性 Redis学习笔记 一、三种删除策略比较 内存占用CPU占用特征定时删除节约内存&#xff0c;无占用不分时段占用CPU资源&#xff0c;频度高时间换空间惰性删除内存占用严重延时执行&#xff0c;CPU利用…...

成都跃享未来教育咨询有限公司抖音小店:引领教育咨询新风尚

在数字化浪潮席卷全球的今天&#xff0c;教育咨询行业正经历着前所未有的变革。成都跃享未来教育咨询有限公司&#xff0c;作为教育行业的一颗璀璨新星&#xff0c;凭借其前瞻性的教育理念与创新的运营模式&#xff0c;在抖音平台上开设了小店&#xff0c;不仅为广大学子及家长…...

【堆排】为何使用向下调整法建堆比向上调整法建堆更好呢?

文章目录 前言一、堆排代码一、计算使用向上调整法建堆的时间复杂度二、计算使用向下调整法插入的时间复杂度总结 前言 在博主的上一篇博客堆排(链接在这里点击即可)的总结中提出啦使用向下调整法建堆比使用向上调整法建堆更好&#xff0c;是因为使用向上调整法建堆的时间复杂…...

在Stable Diffusion WebUI中安装SadTalker插件时几种错误提示的处理方法

SD中的插件一般安装比较简单&#xff0c;但也有一些插件安装会比较难。比如我在安装SadTalker时&#xff0c;就遇到很多问题&#xff0c;一度放弃了&#xff0c;后来查了一些网上攻略&#xff0c;自己也反复查看日志&#xff0c;终于解决&#xff0c;不吐不快。 一、在Stable …...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...