面试速通宝典——11
188. 总结static的应用和作用
- 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。
- 在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其他函数访问。
- 在模块内的static函数只可被这一模块的其他函数调用,这个函数的适用范围被限制在声明它的模块内。
- 在类中的static成员变量属于整个类所拥有,对类的对象只有一份拷贝
- 在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
189. 总结const的应用和作用
- 欲阻止一个变量被改变,可以使用const关键字。在定义const变量时,通常需要对它初始化,因为以后就没有机会去改变他了。
- 对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const。
- 在一个函数声明中,const可以修饰形参,表明他是一个输入参数,在函数内部不能改变其值
- 对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量
- 对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。
190. 什么是指针?谈谈你对指针的理解。
- 指针是一个变量,该变量专门存放内存地址。
- 指针变量的类型取决于其指向的数据类型,在所指数据类型前加*。
- 指针变量的特点是他可以访问所指向的内存。
191. 什么是常指针?什么是指向常变量的指针?
常指针的含义是该指针所指向的地址不能改变,但该地址所指向的内容可以变化,使用常指针可以保证我们的指针不能指向其他变量。
指向常变量的指针是指该指针的变量本身的地址可以发生变化,可以指向其他的变量,但是他所指的内容不可以被修改。
192. 函数指针和指针函数的区别?
函数指针是指向一个函数入口的指针;
指针函数是函数的返回值是一个指针类型。
193. 简述Debug版本和Release版本的区别?
Debug
版本是调试版本,Release
版本是发布给用户的最终非调试版本。
194. 指针的几种典型应用情况
int *p[n]
—— 指针数组,每个元素均为指向整形数据的指针。int (*)p[n]
——p为指向一维数组的指针,这个一维数组有n个整型数据。int *p()
——函数带回指针,指针指向返回的值。int (*)p()
——p为指向函数的指针。
195. static函数与普通函数有什么区别?
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
196. struct(结构)和union(联合)的区别?
struct
和union
都是由多youdao个不同的数据类型的成员组成,但在任何同一时刻,联合中只存放了一个被选中的成员(所有成员共用一块地址空间),而结构的所有成员都存在(不同成员的存放地址不同)。- 对于
union
的不同成员赋值,将会对其他成员重写,原来成员的值就不存在了,而对于结构的不同成员赋值时互不影响的。
解释:
结构体 (struct
)
- 存储:结构体中的所有成员都有自己的独立存储空间。每个成员的地址相对于结构体变量的基地址是固定的,并且所有成员可以同时存在。
- 成员访问:访问结构体的不同成员之间互不影响。例如,如果你向一个成员赋值,这个操作不会影响其他成员的值。
#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
结构体中的三个成员 integer
、decimal
和 character
拥有独立的存储空间,互不影响。
联合体 (union
)
- 存储:联合体的所有成员共享同一块存储空间。这意味着在任何给定时间,联合体只能存储其中一个成员的值。联合体的大小是它最大成员的大小。
- 成员访问:当你给联合体的一个成员赋值时,这个值会影响其他成员,因为所有成员共享同一块存储空间。仅最后赋的值会被保存。
#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
联合体中的三个成员 integer
、decimal
和 character
共享同一个存储空间。当你改变其中一个成员的值时,其他成员的值会被覆盖且不可预测。
关键区别总结:
-
存储空间:
struct
中每个成员都有自己独立的存储空间,因此可以同时存在。union
中所有成员共享同一个存储空间,因此在任何一个时间点只能存储一个成员的值。
-
成员间的关系:
- 在
struct
中,修改一个成员的值不会影响其他成员。 - 在
union
中,修改一个成员的值会影响其他成员,因为所有成员存储在同一块内存中。
- 在
-
用途:
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 的枚举更加强大,它不仅仅是整数常量,还可以定义字段、方法等,像类一样使用。
补充
- 默认值与自定义值:
- 在C语言中,枚举成员从0开始递增,你也可以手动为枚举成员指定值。例如:
enum Day {SUNDAY = 1,MONDAY,TUESDAY = 5,WEDNESDAY,THURSDAY,FRIDAY = 10,SATURDAY};// MONDAY = 2, WEDNESDAY = 6, THURSDAY = 7, SATURDAY = 11
- 在这种情况下,后续未指定值的成员将按之前的值递增。
-
作用域与类型安全:
- 在 C 语言中,枚举成员在编译时期被替换为整数值,具有相同作用域但不严格的类型检查。
- 在 Java 中,枚举是一个真正的类类型,具有类型安全和严格的作用域管理。
-
扩展功能:
- 高级语言中的枚举(如 Java 和 C#)可以包含字段、方法,可以实现接口。
- 可以为枚举添加构造函数、属性以及方法,甚至使用枚举实现一些设计模式,如单例模式。
-
应用场景:
- 枚举常用于定义一组相关但有限的常量值集,如一周的天数、月份、状态码、颜色等等。
- 在状态机实现、资源标识(如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;
}
在这段代码中,1
、2
、3
、500
、1000
和 1500
都是魔法数。它们的含义不清晰,读者无法通过代码直接了解这些数字的具体意义。
使用枚举和常量来避免魔法数
通过使用枚举和常量,可以提高代码的可读性和可维护性。重写上述代码,使用枚举类型和常量:
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;}
}
好处
-
可读性:
- 通过使用有意义的枚举值和常量名,代码更加直观,读者能够轻松理解每个值的含义。
-
可维护性:
- 如果需要修改某个值,只需更改定义处即可,减少了出错的可能性。
-
类型安全:
- 枚举类型提供了一定程度的类型检查,减少了将无效值传递给函数的风险。
-
避免重复:
- 避免了在多个地方重复使用相同的魔法数,使代码更干净、更一致。
总结
魔法数是直接在代码中使用的具体数字常量,通常没有明显的解释或含义。通过使用枚举类型和常量,可以有效避免魔法数,提高代码的可读性、可维护性和类型安全性。这是一种良好的编程实践,能够使代码更加清晰、易懂和易于管理。
199. assert()的作用?
assert()
是一个调试程序时经常使用的宏,在程序运行时他计算括号内的表达式,如果表达式为False
(0),程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。
这个宏通常用来判断程序中是否出现了明显的非法数据,如果出现了终止程序以免导致更严重的后果,同时也便于查找错误。
相关文章:
面试速通宝典——11
188. 总结static的应用和作用 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其他函…...
python:reportlab 将多个图片合并成一个PDF文件
承上一篇:java: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…...
决策树:机器学习中的强大工具
什么是决策树? 决策树是一种通过树状结构进行决策的模型。它的每个节点代表一个特征(或属性),每个分支代表特征的可能值,而每个叶子节点则代表最终的决策结果或分类。想象一下,在选择晚餐时,你…...

平面电磁波(解麦克斯韦方程)电场相位是复数的积分常数,电场矢量每个分量都有一个相位。磁场相位和电场一样,这是因为无损介质中实数的波阻抗
注意无源代表你立方程那个点xyzt处没有源,电场磁场也是这个点的。 j电流面密度,电流除以单位面积,ρ电荷体密度,电荷除以单位体积。 j方程组有16个未知数,每个矢量有三个xyz分量,即三个未知数,…...

复习HTML(进阶)
前言 上一篇的最后我介绍了在表单中,上传文件需要使用到 method属性 和enctype属性。本篇博客主要是详细的介绍这些知识 <form action"http://localhost:8080/test" method"post" enctype"multipart/form-data"> method属性…...
Qt 每日面试题 -7
61、如何安全的在另外一个线程中调用QObject对象的接口 QObject被设计成在一个单线程中创建与使用,因此,在一个线程中创建一个对象,而在另外的线程中调用它的函数,这样的行为不能保证工作良好。使用信号槽的队列连接或者QT的反射…...

《计算机原理与系统结构》学习系列——计算机的算数运算(下)
系列文章目录 目录 浮点数的表示和运算浮点数的表示浮点数的规格化浮点数标准IEEE754浮点数表示范围浮点数的转换浮点数的运算浮点数加法浮点数加法的硬件实现 精度浮点乘法浮点运算硬件 MIPS中的浮点指令 浮点数的表示和运算 浮点数的表示 表达非整型的数 可以表达很小和很大…...

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

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

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

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

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

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

Arduino UNO R3自学笔记13 之 Arduino使用LM35如何测量温度?
注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。 前言:学习使用传感器测温。 1.LM35介绍 一般来讲当知道需求,就可以 通过既定要求的条件来筛选需要的器件,多方面的因素最终选定了器件…...

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

Apollo9.0 Planning2.0决策规划算法代码详细解析 (4): PlanningComponent::Proc()
🌟 面向自动驾驶规划算法工程师的专属指南 🌟 欢迎来到《Apollo9.0 Planning2.0决策规划算法代码详细解析》专栏!本专栏专为自动驾驶规划算法工程师量身打造,旨在通过深入剖析Apollo9.0开源自动驾驶软件栈中的Planning2.0模块&am…...
AAA Redis的过期删除策略+缓存雪崩+缓存一致性问题
目录 一、三种删除策略比较 二、缓存雪崩缓存击穿缓存穿透 三、缓存一致性 Redis学习笔记 一、三种删除策略比较 内存占用CPU占用特征定时删除节约内存,无占用不分时段占用CPU资源,频度高时间换空间惰性删除内存占用严重延时执行,CPU利用…...

成都跃享未来教育咨询有限公司抖音小店:引领教育咨询新风尚
在数字化浪潮席卷全球的今天,教育咨询行业正经历着前所未有的变革。成都跃享未来教育咨询有限公司,作为教育行业的一颗璀璨新星,凭借其前瞻性的教育理念与创新的运营模式,在抖音平台上开设了小店,不仅为广大学子及家长…...
【堆排】为何使用向下调整法建堆比向上调整法建堆更好呢?
文章目录 前言一、堆排代码一、计算使用向上调整法建堆的时间复杂度二、计算使用向下调整法插入的时间复杂度总结 前言 在博主的上一篇博客堆排(链接在这里点击即可)的总结中提出啦使用向下调整法建堆比使用向上调整法建堆更好,是因为使用向上调整法建堆的时间复杂…...

在Stable Diffusion WebUI中安装SadTalker插件时几种错误提示的处理方法
SD中的插件一般安装比较简单,但也有一些插件安装会比较难。比如我在安装SadTalker时,就遇到很多问题,一度放弃了,后来查了一些网上攻略,自己也反复查看日志,终于解决,不吐不快。 一、在Stable …...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...