思维导图
整理面试题
1、什么是回调函数
答:将函数作为参数传到另一个函数里面,当那个函数执行完之后,再执行传进去的这个函数。这个过程就叫做回调。
2、结构体和共用体的区别
答:结构体的每个成员都会分配内存,大小又各个成员的内存之和但要满足字节对齐原则
共用体的内存以占字节数最大的成员为主
3、赋值与初始化有什么不同
答:初始化是从无到有的过程,先分配空间,然后再填充数据;赋值是对己有的对象进行操作。
对于基本数据类型,二者是没有任何区别,对于非基本数据类型,在写法与效率上有许多不同。
4、局部变量和全局变量能否重名
答:能,局部会屏蔽全局。要用全局变量,需要使用"::",局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体
5、形参和实参有什么区别
答:形参(Formal Parameter)是函数定义时声明的参数,它是函数内部的局部变量。形参在函数定义时指定了参数的类型和名称,用于接收函数调用时传递的实参的值。
实参(Actual Argument)是函数调用时传递给函数的值或变量。实参可以是常量、变量、表达式或者其他函数的返回值。实参的值会被传递给对应的形参,从而在函数内部进行处理。
形参和实参之间的区别主要有以下几点:
1>定义位置:形参是在函数定义时声明的,位于函数的参数列表中;实参是在函数调用时传递的,位于函数名后面的括号中。
2>数据类型:形参可以指定具体的数据类型,用于接收相应类型的实参;实参可以是任意合法的表达式或变量。
3>值传递:实参的值会被传递给对应的形参,形成一次值传递。在函数内部对形参进行修改不会影响到实参的值。
4>作用范围:形参只在函数内部有效,超出函数范围后就无法访问;实参在函数调用时生效,可以在函数内部使用。
6、数组与指针的区别是什么
答:指针的大小是固定的,数组的大小是根据申请时数据类型和元素个数决定的
数组名表示的是首元素地址,从功能上等同于一个地址,数组是构造数据类型,指针是指针类型
7、void指针就是空指针吗?它有什么作用?
答:空指针是(void*)0,void指针是万能指针,可以执行任意类型的地址
void的指针不能直接解引用,必须先转换为具体的指针后再使用
8、简述快速排序的思想
答:快速排序是一种常用的排序算法,它的基思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列的目的。
具体的快速排序算法步骤如下:
1.>选择一个基准元素(通常选择第一个元素)。
2.>将序列中所有比基准元素小的元素移到基准元素的左边,将序列中所有比基准元素大的元素移到基准元素的右边。
3.>对基准元素的左右两个子序列重复步骤1和步骤2,直到每个子序列只有一个元素。
快速排序的关键在于划分操作,即如何将序列中的元素按照基准元素进行划分。常用的划分方法是使用双指针法,即设置一个左指针和一个右指针,左指针从序列的左边开始向右移动,右指针从序列的右边开始向左移动,当左指针指向的元素大于基准元素且右指针指向的元素小于基准元素时,交换左右指针指向的元素,直到左指针和右指针相遇,此时将基准元素与左指针指向的元素进行交换。
快速排序的时间复杂度为O(nlogn),其中n为待排序序列的长度。它是一种原地排序算法,不需要额外的存储空间。
9、什么是野指针?怎么避免野指针?
答:野指针即非法访问
①未初始化的指针②释放堆区空间后,指针没有指向NULL③越界访问数组的指针④指向一个空间后,空间被释放的指针
避免野指针:①初始化指针②防止指针越界访问数组③防止指针指向一个被释放的空间④使用指针之前检查有效性
10、网络7层体系结构
答:①物理层②数据链路层③网络层④传输层⑤会话层⑥表示层⑦应用层