
经典面试题
文章平均质量分 75
程序员小明丶
这个作者很懒,什么都没留下…
展开
-
TCP和UDP的优缺点以及区别
一、TCP(传输控制协议)TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,速度相对较慢,一般应用在对安全性、完整性有严格要求的场景,如FTP、SMTP、HTTP等。三次握手:TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认,如果发送端实体在合理的往返时延内未收到确认,那么对应的数据(...原创 2019-09-02 19:57:10 · 10470 阅读 · 0 评论 -
Linux常见的基础指令
一、不懂的命令man 命令(查用法、全称),只记得关键词,可用man -k 关键词。二、系统信息1、who am i :查看当前使用的终端2、who 或 w : 查看所有终端3、date :显示系统日期4、clear :清空命令行5、ifconfig :显示或设置网卡(查ip等)6、kill -9 进程号 :强制杀死进程三、文件和目录操作1、cd :进入该用户的主目录 ~(ro...原创 2019-09-15 16:05:26 · 214 阅读 · 0 评论 -
虚函数详解
一、什么是虚函数类的成员函数前加 virtual 这种函数就叫做虚函数二、和虚函数相关的一些概念1、纯虚函数:在虚函数的声明的后面添加=0,这种虚函数就叫纯虚函数。可以不实现,但如果实现必须在类外(只能在父类的构造函数、析构函数中调用)2、抽象类:成员函数中有纯虚函数,这种类叫抽象类,抽象类不能实例化(不能创建对象),抽象类必须被继承且纯虚函数被覆盖后,由子类实例化对象,如果继承抽象类,但...原创 2019-10-04 11:07:58 · 8274 阅读 · 0 评论 -
解析宏函数与内联函数
一、宏函数的优点宏函数只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率二、宏函数的缺点宏函数只是简单的文本替换,不会做类型和语法的检查,而且宏函数容易出现二义性三、内联函数的优点提高程序的运行速度(因为没有跳转,也不需要返回)四、内联函数的缺点会导致可执行文件增大(冗余),也就是牺牲空间来换取时间五、为什么内联函数会提高程序运行速...原创 2019-10-04 15:00:09 · 463 阅读 · 0 评论 -
STL模板库中常用的容器
一、C++中容器类型C++中有两种类型的容器:顺序容器和关联容器顺序容器主要有vector、list、deque等关联容器主要有map和set注意:容器类自动申请和释放内存,因此无需new和delete操作二、迭代器类似于专门用来指向容器成员的指针,用来遍历、操作、管理容器中的成员,可以大大提高对容器的访问速度用法:容器类名<>::iterator 迭代器名*迭代器名...原创 2019-10-04 19:50:04 · 519 阅读 · 0 评论 -
重载、覆盖和隐藏的区别
一、重载重载简单的来说就是在同一作用域下,函数名字相同但是函数的参数列表不同(包括参数个数和参数类型)就构成了重载,但是与返回值无关。二、覆盖1、首先覆盖必须是虚函数(被virtual修饰的函数)2、必须是子类的虚函数覆盖父类的虚函数3、函数签名必须相同(参数列表必须完全一致,const属性也会影响覆盖的结果)4、返回值必须是同类或者父子类(子类的返回值要能向父类进行隐式转换)三、隐...原创 2019-08-29 20:40:23 · 865 阅读 · 0 评论 -
空指针与野指针
一、什么是空指针指针变量的值等于NULL(#define NULL ((void *)0))的指针叫做空指针注意:空指针不能解引用,因为此地址存储的是系统复位时要使用数据,不能访问,一旦解引用就会出现段错误二、如何避免使用空指针对来历不明的指针前要先判断是否是空指针,if(NULL == p)注意:NULL不一定是0,也有可能是1三、什么是野指针指向的内存不明确的指针叫野指针...原创 2019-10-05 11:02:32 · 501 阅读 · 0 评论 -
如何写Makefile
一、什么是MakefileMakefile是一种编译脚本,里面记录的编译代码的命令的集合二、为什么要使用Makefile1、随着项目规模的不断增加,代码量越来越来多,为了更好的管理代码、协同工作,不得不把代码拆分、设计成多个文件2、由于源文件过多,编译时命令不易写,编译时间过长,而使用Makefile可以多目录编译,一次编写循环利用,有效节约编译时间3、Makefile中可以使用分支、循...原创 2019-10-05 16:41:26 · 309 阅读 · 0 评论 -
如何判断大小端
一、什么是大小端低位地址存储低位数据的是小端,低位地址存储高位数据的是大端举个例子:假设我定义int num = 0x01020304;,那么0x01是高位数据,0x04是低位数据,我们再假设这个数据存储在0xe1e2e3e4这个地址中那么如果数据是这么存的就是小端:0xe1e2e3e4(低位地址) = 0x040xe1e2e3e5 = 0x030xe1e2e3e6 = 0x02...原创 2019-10-05 17:15:21 · 1711 阅读 · 0 评论 -
fork,vfork,fork和vfork区别详解
forkpid_t fork(void);功能:创建一个新进程。返回值:一次调用两次返回,子进程返回0,父进程返回子进程ID,出错返回-1。1、两次返回分别是进程ID和0,父进程会拿到子进程的ID,子进程返回0,借此可以分别出父子进程,编写不同的处理分支。2、通过fork创建的子进程就是父进程的副本(拷贝),子进程会获取父进程数据段、bss段、堆、栈、IO流(共享文件指针和文件描述符)...原创 2019-08-07 17:29:19 · 484 阅读 · 2 评论 -
strlen与sizeof的区别
1、strlen是函数,sizeof是运算符2、strlen只能计算字符串的长度,而且要想得到正确的长度,字符串后面必须包含’\0’,sizeof的参数可以是数组、指针、类型、对象、函数等3、在计算字符数组的时候strlen算的是实际有的字符数,而sizeof计算的是数组的大小举个例子:#include <stdio.h>#include <string.h>...原创 2019-10-06 15:11:00 · 361 阅读 · 0 评论 -
内存泄漏
一、什么是内存泄漏由于内存管理失败导致堆内存忘记释放或者无法释放,导致堆内存无法循环使用的情况叫做内存泄漏注意:当程序结束后所有的资源都会被系统回收,包括泄漏的内存二、内存泄漏的原因1、C语言中malloc/free函数不匹配(忘记写free或者没有执行到free),在C++中类的构造函数和析构函数中没有匹配的调用new和delete函数2、 在释放对象数组时在delete中没有使用方括...原创 2019-10-06 15:47:55 · 340 阅读 · 0 评论 -
深入理解指针
一、什么是指针指针是一种数据类型,是无符号整数,不过这个整数有特殊意义,它代表着内存编号二、为什么要用指针1、函数之间需要共享变量,全局变量虽然也可以,但是不宜过多,可以把变量的地址编号传递给其它函数来达到共享变量的目的2、优化函数之间的传参效率,函数之间采用的是值传递传参,是内存的拷贝,当传的字节数很多时,效率会很低,但是如果只是传递变量的地址只需要传4字节(64位操作系统是8字节)3...原创 2019-10-06 15:49:44 · 662 阅读 · 0 评论 -
链表和数组优缺点
一、数组的优点随机访问性强,查找速度快二、数组的缺点1、对内存的要求高,必须要连续的内存空间2、插入和删除的效率比较低3、数组大小固定,动态拓展性差,而且可能浪费内存三、链表的优点1、对内存的要求低2、大小可以不固定,内存的利用率比较高3、插入和删除方便四、链表的缺点查找效率低,不可以随机查找,每次查找必须从头开始...原创 2019-10-03 20:28:32 · 5987 阅读 · 0 评论 -
C/C++的区别
1、C语言是面向过程的语言,C++是面向对象的语言2、C语言用的是GCC编译器(现在也可以编译C++了),C++用的是G++编译器3、布尔类型是C++的关键字,但是不是C语言的关键字4、标准输入流输出流不同(C语言中是用scanf/printf实现的C++中是靠cin/cout(cout是 ostream 类型的对象,cin 是 istream 类型的对象)类实现的)5、在C++中可以函数...原创 2019-10-03 20:16:56 · 528 阅读 · 0 评论 -
死锁产生的条件和预防方法
一、什么是死锁多个线程都在等待对方的资源,在没有得到资源之前,都不会释放自己的资源,这样造成的循环等待现象,称为死锁。二、死锁产生的四大条件1、资源互斥2、占有,还想占有(请求并保持)3、资源不可剥夺4、环路等待(互相等待)三、预防方法构成死锁的四个条件只要破坏其中一个就构不成死锁,死锁一旦形成就无法消除,因此最好的方法就是避免产生死锁。1、破坏互斥条件,让资源能够共享,但缺点是...原创 2019-09-28 21:00:42 · 629 阅读 · 0 评论 -
进程和线程的区别
一、进程进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。简单点来说就是运行中的程序。二、线程线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。简单点来说线程就是进程中的执行线路。三、进程和线程的区...原创 2019-09-02 20:16:23 · 171 阅读 · 0 评论 -
线程同步的方式
一、线程的同步线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态。简单点来说就是线程同步事情只能一件一件做,这件事做完了才能做下一件事。注意:“同”字从字面上容易理解为一起动作,但其实不是的,“同”字应是指协同、协助、互相配合。举个例子:进程或线程A和B一块配合,A执行到一定程度时...原创 2019-09-11 19:35:26 · 285 阅读 · 0 评论 -
const与指针的配合使用
1、const char* p(char const *p)保护的是指针指向的数据,不能通过该指针修改数据。错误例子:#include <stdio.h>int main(){ char str[] = "hehe"; const char* p = str; //str[0] = 'a'; p[0] = 'a'; return 0;}运行结果:test...原创 2019-09-16 19:26:19 · 400 阅读 · 2 评论 -
指针函数与函数指针的用法与区别
一、区别1、指针函数:指的就是返回值是指针的函数,本质就是个函数。2、函数指针:指的是指向函数的指针变量,本质就是个指针。二、用法1、指针函数:int* func(int a,int b);普通函数就是int func(int a,int b);,返回值是int,而指针函数就是返回值是指针的函数,即返回值是int*。2、函数指针:int (*func)(int x,int y);这里......原创 2019-09-16 20:16:58 · 16010 阅读 · 2 评论 -
选择排序
一、选择排序(不稳定 时间复杂度:O(N²))选择排序的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。二、代码//交换两个数的值#define swap(a,b) {typeof(a) t=a; a=b; b=t;}// 选择排序...原创 2019-09-19 15:50:56 · 139 阅读 · 0 评论 -
OSI参考模型与TCP/IP参考模型
1、OSI从下到上一共七层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。2、TCP/IP目前只实现了四层,从下到上:物理层:负责通信网络收发数据包。网络层:选择、流量控制、网络拥塞,IP协议是该层的核心。传输层:机器之间建立用于会话的端到端连接(用于数据传输),该层的核心是TCP/UDP。应用层:主要为用户提供针对性的服务,这一层的代表协议有:HTTP,SMTP,FTP,...原创 2019-09-19 16:50:57 · 546 阅读 · 0 评论 -
C++面向对象的三个基本特征
一、三大特征封装,继承,多态。二、封装所谓封装就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.封装是面向对象的特征之一,是对象和类概念的主要特性. 简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防...原创 2019-09-19 20:03:53 · 4920 阅读 · 0 评论 -
大华面试题:用函数找出一个整型数组中第二大的数
一、函数代码基本思想:用选择排序第一遍排序,先找出最大值,然后之前的数就是第二大的数,但是有两个个特殊情况要注意:1、数组刚好是有序的2、后面出现的数字比max小,但是比_max大int func(int* arr,int len){ //max是最大的数,_max是第二大的数 int max = arr[0],_max = 0; bool flag = true; //...原创 2019-09-20 12:00:26 · 733 阅读 · 2 评论 -
二分查找
一、二分查找(时间复杂度 O(log2n))1、什么是二分查找首先假设数据是升序的,然后记录下中间的数据,让要查找的数据与它比较,如果相等那么查找成功,如果不相等,那么把数据以这个中间的数据为界限分成前后两部分,如果要查找的数据比中间的这个数据小那么就去前半部分查找,如果要查找的数据比中间的这个数据大那么就去后半部分查找,重复以上过程,直到找到满足条件的数据,如果出现左边的数据比右边的大,那么...原创 2019-09-22 11:24:10 · 174 阅读 · 0 评论 -
单例模式
一、什么是单例模式只能创建出一个类对象(只有一个实际的实例)的叫做单例模式。注意:1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。从具体实现角度来讲就是三点:1、单例模式的类只提供私有的构造函数。2、类定义中含有一个该类的静态私有对象。3、该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。二、为什么使用单...原创 2019-09-22 15:42:42 · 185 阅读 · 0 评论 -
volatile关键字
一、编译器的优化1、什么是编译器的优化?在本次线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致。2、编译器优化带来的问题当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致。当该...原创 2019-09-23 20:59:50 · 241 阅读 · 0 评论 -
static关键字的作用
一、static修饰局部变量1、不加static修饰,局部变量在函数或者代码块中执行完毕后就直接回收销毁了,每次执行都会重新分配内存。2、加了 static 修饰,局部变量在函数或者代码块中执行第一次初始化分配内存后,就算在函数或者代码块中执行完毕,该变量也不会被回收、销毁,一直会到程序结束 static 变量才会被回收。注意:加了static关键字后局部变量的位置会从栈空间转到全局数据区(...原创 2019-09-24 14:32:14 · 455 阅读 · 0 评论 -
C语言中的内存分配
1、代码段(text)里面存储的是可执行程序的二进制指令,为了防止被意外修改,代码段一般是只读的2、全局段(数据段data)存储被初始化过的全局变量、静态变量3、bss段(静态数据段)存储静态变量(被static修饰过的变量)和末初始化的全局变量,这段内存在程序运行前会被初始化为04、堆(heap)程序员手动管理,与指针配合使用,足够大,释放时间受控制,但不安全,容易产生内存碎片、内...原创 2019-10-06 20:40:12 · 365 阅读 · 0 评论