绘制思维导图
将今天的模拟面试内容进行整合并上传作业
1、什么是回调函数?
回调函数是一种作为参数传递给其他函数的函数,在 C 语言中,函数指针允许我们将函数作为参数传递给其他函数,从而实现回调函数的功能,例如线程的创建函数。
2、结构体与共用体的区别
-
结构体(struct):
- 结构体是一种用户自定义的数据类型,允许将不同类型的数据组合在一起,形成一个结构体变量。
- 结构体中的各个成员在内存中是依次排列的,可以同时存储多种不同类型的数据。
- 结构体的成员占用独立的内存空间,结构体变量的大小等于其所有成员占用空间之和。
- 结构体的成员可以被分别访问和操作,通过
.
操作符来访问结构体的各个成员。
-
共用体(union):
- 共用体也是一种用户自定义的数据类型,与结构体类似,但在内存中的结构不同。
- 共用体允许在同一块内存空间中存储不同类型的数据,但同一时刻只能存储其中的一个成员。
- 共用体的所有成员共享同一块内存空间,大小等于最大的成员所占用的空间。
- 修改一个共用体的成员会影响其他成员的值,因为它们共享同一块内存空间。
3、赋值与初始化有什么不同?
- 赋值(Assignment):
- 赋值是指将一个值或表达式赋给一个已经存在的变量。
- 赋值操作用于更新或修改已经存在的变量的值。
- 赋值操作使用赋值操作符(=)来将右侧的值赋给左侧的变量。
- 赋值操作可以在变量声明后进行,用于改变变量的当前值。
- 初始化(Initialization):
- 初始化是指在创建变量时给变量一个初始值。
- 初始化操作在变量声明时进行。
- 初始化可以保证变量在创建时拥有一个明确定义的初始值。
- 不同的编程语言对变量的初始化要求可能不同,有些语言要求所有变量在使用前必须进行初始化。
4、局部变量和全局变量能否重名?
虽然局部变量和全局变量可以具有相同的名称,但应谨慎使用,避免潜在的混淆和错误,并根据需要选择更具描述性的变量名称以提高代码的可读性和可维护性。
5、形参和实参有什么区别?
形参是函数定义中声明的用于接受传递值的变量,而实参是在函数调用时提供给函数的具体数值或变量。形参和实参之间通过函数调用进行绑定,实参的值会传递给对应的形参,以便函数内部使用这些值进行操作。
实参的表现形式: 常量、变量、表达式
形参的表现形式: 只能是变量
6、数组与指针的区别是什么?
-
定义和用法:
- 数组是一组相同类型的元素的集合,可以通过下标来访问数组中的元素,其大小在定义时就确定,且不可改变。
- 指针是一个变量,存储着一个内存地址,可以指向其他变量或数据的内存地址,通过指针可以访问或修改其指向的数据。
-
内存分配:
- 数组在内存中是连续存储的,相邻元素之间的地址是连续的,可以通过指定下标来访问数组元素。
- 指针只是存储了一个地址,可以指向任意类型的数据,通过指针进行间接访问。
-
动态性:
- 数组的大小在定义时就需要确定,并且在程序运行过程中无法改变。
- 指针可以通过指向不同的变量或内存地址来实现灵活的数据访问,可以在运行时动态指向不同的数据。
-
数组名和指针:
- 数组名是数组第一个元素的地址,可以直接使用数组名来表示整个数组,在大多数情况下会转换为指向数组第一个元素的指针。
- 指针是一个变量,可用于存储地址,通过指针运算可以访问不同位置的内存。
7、void指针就是空指针吗? 他有什么作用?
void 指针是一种可以指向任意类型数据的通用指针,而空指针代表不指向任何地址的特殊指针值。对于任何类型的指针来说,都可以将其赋值为 NULL来创建一个空指针。
8、简述快速排序的思想
-
选择基准值(Pivot):
从数组中选择一个元素作为基准值。基准值的选择可以是数组中的任意一个元素,比如第一个元素、最后一个元素、中间元素或者随机元素。(不同的选择可能会影响算法性能) -
分区操作(Partitioning):
将数组进行分区,重新排列数组中的元素,使得所有比基准值小的元素排在基准值的前面,而所有比基准值大的元素排在基准值的后面。分区完成后,基准值就处于数组的一个中间位置,这个位置称为分区索引。 -
递归排序:
将基准值的左边和右边看作两个新的数组,分别对这两个子数组重复进行上述的选择基准值和分区操作。递归地进行这个过程,直到每个子数组只有一个元素或没有元素,此时数组便被排序完成。
9、什么是野指针,如何避免野指针?
-
未初始化的指针:声明了指针变量但没有明确地初始化。未初始化的指针可能指向任意内存地址,使用这样的指针可能导致不可预料的结果。
-
已释放的内存地址:指针指向的内存已经被释放(如调用
free
或delete
),但指针没有被置为NULL
。此时,指针仍然指向原来的内存地址,但该地址的内容已经不再属于程序,随时可能被分配给其他用途。 -
指针操作越界:访问数组时,指针操作后超出了本来它所指向的内存块界限,这种情况下指针也可能成为野指针。
-
指向栈内存的指针:函数返回时,其栈内存可能被释放或被其它函数调用重写,如果有指针指向这部分栈内存,那么指针也会变成野指针
10、网络7层体系结构
-
物理层
- 物理层是网络体系结构的最底层,负责传输比特流并建立物理连接以在网络设备之间传输数据。
- 物理层定义了电气、机械和功能特性来传输数据比特,如电压、频率、光强度等。
-
数据链路层
- 数据链路层负责在直连的节点之间传输数据帧,并提供了错误检测和纠正。
- 数据链路层可分为两个子层:逻辑链路控制子层(Logical Link Control, LLC)和介质访问控制子层(Media Access Control, MAC)。
-
网络层
- 网络层负责在不同网络之间实现路由和转发功能,为数据包选定最佳路径,并将数据包从源节点传输到目的节点。
- IP(Internet Protocol)是网络层最著名的协议。
-
传输层
- 传输层提供端到端的通信和数据传输服务,确保数据包的可靠传输以及数据包的完整性。
- 常用的传输层协议包括 TCP(传输控制协议)和 UDP(用户数据报协议)。
-
会话层
- 会话层负责管理和协调应用程序之间的对话或会话,并为数据传输提供必要的同步。
- 在通信的两端建立、管理和终止会话是会话层的主要职责。
-
表示层
- 表示层负责数据的格式化、编解码和加密解密,以确保不同系统和应用程序之间能够正确地交换数据。
- 表示层还处理数据的压缩、加密和字符集转换等任务。
-
应用层
- 应用层是网络体系结构的最高层,为用户提供网络服务和支持应用程序的功能,如电子邮件、文件传输、Web 浏览等。
- 应用层协议如 HTTP(超文本传输协议),FTP(文件传输协议)等在此层实现。