1>思维导图
2>面试问题
I、
(1)什么是回调函数?
回调函数是作为参数传递给其他函数的函数。通过函数指针,例如异步编程、线程的创建函数。
(2)结构体与共用体的区别:
结构体是一种数据结构,其成员占用不同的内存空间,共用体是一种特殊的结构体,其所有成员共享同一块内存空间,用于节省内存。
结构体的大小是各个成员所占内存之和,共用体大小是以成员中最大成员为主。
(3)赋值与初始化有什么不同?
赋值是将变量的值赋给另一个变量,初始化是将定义变量时给变量初始赋值。
(4)局部变量和全局变量能否重命?
能,因为局部变量作用域只在函数内部,在函数内,局部变量会覆盖掉全局变量不会影响全局变量。
如果想在函数内调用全局变量,可以用extern声明外部全局变量。
#include <stdio.h>
int num= 10; // 全局变量
int main() {
extern int num; // 声明外部全局变量
printf("num= %d\n", num); // 使用外部全局变量
return 0;
}
(5)形参和实参有什么区别?
形参是函数定义时的参数,实参是函数调用时传递给形参的值。
形参是函数内部的局部变量,实参是传递给函数的具体值。
形参只能是变量,实参可以是变量、表达式、常量。
II、
(1)数组与指针的区别是什么?
数组是构造数据类型,是一种数据结构,在内存中占用连续的空间;指针是指针类型,它在内存中占8B或4B
数组需要直接通过下标访问元素;指针需要通过解引用操作符*来访问指针指向的值。
数组名表示数组首元素地址、数组名做参数传给函数时,可以将数组名视为指向其首元素的指针;指针可以指向任意类型的数据,包括基本类型、结构体、指针。
数据的大小是固定的,一旦声明,其大小不能改变;指针本身的大小是固定的,但它可以指向任意大小的内存块
数组如果是局部数组,其生命周期与其所在的函数一致;如果是全局数组或静态数组,其生命周期与程序一致;指针变量的生命周期取决于其声明的位置(局部或全局),但指针所指向的内存可以是动态分配的,其生命周期可以通过malloc和free来控制。
(2)void指针就是空指针吗?它有什么作用?
空指针时(void*)0,void指针是通用类型指针,可以执行任意类型的数据。
void指针不能直接解引用,必须先转换为具体的指针后再使用。
(3)简述快速排序的思想
从待排序列中选择基准值(默认是数列的第一个),拿基准值一次和序列的每一个元素进行比较
如果大于基准值防止后边,小于基准值放在前边,分成两个子序列,确定基准值的位置,分成两个子序列,重复以上过程,直至序列为有序序列
(4)什么是野指针,如何避免野指针
创建指针时没有给指针指向,即对指针的非法访问。
在创建指针时,要对还没有明确指向的指针赋值为NULL。
在用指针对数组进行操作时,注意别越界。
在申请动态堆区空间后,回收时记得将指针赋值为NULL。
注意指针指向局部变量时,不能超过其作用域使用。
(5)网络7层体系结构
物理层、数据链路层、网络层、运输层、会话层、表示层、应用层
TCP/IP:网络接口层、网际层、运输层、应用层
学习:物理层、数据链路层、网络层、运输层、应用层