1)什么是回调函数及其实现方式?
本身是一个函数,但是同时又是另一个或多个函数的参数,该函数被称为回调函数,在c中其实现方式多为函数指针,通过函数指针,将回调函数作为参数传递给另一个函数
2)结构体和共用体的联系与区别?
联系:
在c语言中都是构造类型的,可以用来定义复杂的数据类型,都可以包含多个不同的数据成员
区别:
内存占用区别------结构体的总大小是所有成员大小之和;共用体内存大小只取决于共用体内最长成员
成员存在方式区别------结构体各个成员在内存中分别占用独立的存储空间;共用体各个成员共享同一片内存,以最长成员为准
使用场景区别-----结构体适用于需要同时存储多个结构不同类型的数据的情况;共用体适用于同时存储多个数据类型相同的数据时又要满足节省内存空间需求时
3)赋值和初始化有什么区别?
两者都是给变量分配值的过程,赋值一般在程序执行过程中,给变量一个新的值, 更改其原来的值,而初始化时往往是在程序开始执行时给变量定义一个最初的值的过程为初始化
4)局部变量和全局变量能否重名?如何通过局部变量更改全局变量的值?
1、可以重名但是有“就近原则”,两者的作用范围和优先级不同,导致在局部变量范围内重名变量会采用局部变量的值,但是在改局部区域结束释放后,该局部变量值的变化不会引起全局变量的改变
2、可以通过指针,用该指针指向全局变量,通过指针,间接访问和修改全局变量
5)形参和实参的区别?
实参是函数调用时提供的参数,用于传递给函数的值,可以是常量、变量、表达式
形参是函数定义时声明的参数,用于接受函数调用时传递的值,必须要和实参一一对应且必须为变量
6)数组和指针有什么区别和联系?
联系:都可以存储内存地址,都可以传递数组(数组和指针都可以作为参数传递)
区别:类型区别——数组是构造类型,而指针是指针类型
内存分配区别——数组在声明时就已经分配了的内存空间,大小固定;而指针声明时没有分配内存空间,它的值是一个内存地址,这个地址可以指向任意一个已经分配的内存空间
动态性区别——数组大小编译时就已经确定,不可以改变,不可以自增自减;而指针可以在运行时改变所指向的内存位置
7)void指针就是空指针吗?他有什么作用?
void指针不是空指针,他是万能指针,可以指向不同类型的数据,但是不可以直接解引用,需要按需进行强制转换。void是一个关键字,表示没有具体的类型,而void *才是一种指针类型、空指针是指不指向任何有效对象的指针,如(void *)0
作用:用于函数参数传递——使用void指针传递和处理各类参数
用于动态内存分配——当需要为多个不同类型的数据分配内存时,使用void指针来申请和释放动态内存
通用类型指针——某些情况下,不确定数据的确切类型,可以使用该通用指针
8)简述快排的思想
第一步:选择一个基准值,选定一个数作为基准值;
第二步:划分操作,通过比较各个值与基准值的大小关系,将数组划分成左右两边
第三步:递归排序,针对划分后的左右两个子数组再次进行上述两步操作,实现递归应用,直到递归到子数组长度小于等于1
第四步:合并数组,将左数组、基准值、右数组按照顺序合并在一起,形成最终的排序数组
9)什么是野指针?如何避免野指针?
野指针是指指向非法地址的指针。产生条件一般是:未初始化的指针;释放内存后没有指向NULL的指针;数组的越界访问;指向临时空间的指针,如局部变量;
对应的如何避免就是:要初始化指针;释放内存后要指向NULL;防止数据的越界访问;指针不要指向临时空间
10)网络七层体系结构
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层