面试知识点
陈先生☁
这个作者很懒,什么都没留下…
展开
-
MVC设计模式
一、M、V、C是什么?M是model模型,V是view视图,C是control控制器二、mvc设计的分层水平方向上 :1、用户界面层:处理与最终用户的交互,既负责从用户处收集信息,也负责向用户展现结果、给出提示或反馈。2、业务逻辑层:针对用户界面层所体现的功能项,以数据访问层为基础,实现与业务逻辑相关的算法和流程。3、数据访问层:实现对数据存储介质的访问,为业务逻辑层提供数据源,并接受其处理结果。垂直方向上:1、接口层:...原创 2021-11-17 09:42:22 · 575 阅读 · 0 评论 -
递归过多的问题和解决
出现的问题: 会导致程序运行速度变慢、堆栈溢出、数据混乱解决方法: 1、用循环进行替换 2、限制递归次数 3、用非递归方法实现原创 2021-11-17 09:25:27 · 1134 阅读 · 0 评论 -
互斥锁、读写锁、自旋锁
1.互斥锁互斥锁 互斥量 pthread_mutex_t 互斥锁有种类 只允许一个线程获得锁 pthread_mutex_lock 去获得锁,阻塞 线程进入睡眠 自动让出CPU2、读写锁pthread_rwlock_t 写锁 独占锁 排它锁 读锁 共享锁 当读的频率高于写的频率时,用读写锁能够提高运行效率 如果是读锁,允许有多个线程同时上读...原创 2021-11-16 23:08:05 · 665 阅读 · 0 评论 -
gdb简单调试
步骤:1、limit -c unlimited //把core设置成无限大 2、gcc/g++ -g xxx.c/xxx.cpp 3、./a.out //运行程序 4、gdb a.out -c core //调试core文件5、bt/where...原创 2021-11-16 10:24:08 · 283 阅读 · 0 评论 -
进程和线程
区别:1、定义不一样,进程是执行中的一段程序,而一一个进程中执行中的每个任务即为一个线程。2、一个线程只可以属于一个进程,但一个进程能包含多个线程。3、线程无地址空间,它包括在进程的地址空间里。4、线程的开销或代价比进程的小。...原创 2021-11-15 17:15:49 · 252 阅读 · 0 评论 -
排序算法 C
冒泡: i的起始位置是数组的末尾,j是数组的第一个元素,j从第一个数开始找大的值,每次和下一位进行比较,把最大的值放到j+1位,保证i的位置存放最大值,falg记录是否发生过交换,没有发生过交换则说明排序已完成// 冒泡void bubble_sort(TYPE* arr,size_t len){ bool flag = true;//flag记录中间过程是否产生过一次交换 for(int i=len-1; i>0 && flag; i--) { flag = fa原创 2021-11-15 09:31:07 · 634 阅读 · 0 评论 -
TCP客户端
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>typedef struct sockaddr* SP;int原创 2021-11-14 10:08:56 · 1864 阅读 · 0 评论 -
TCP服务端
#include <stdio.h>#include <unistd.h>#include <string.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>typedef struct sockaddr* SP;vo.原创 2021-11-14 10:08:15 · 2974 阅读 · 0 评论 -
C文本读写
文件IO: FILE *fopen(const char *path, const char *mode); 功能:打开或创建文件 path:文件的路径 mode:打开模式 r 以只读权限打开文件,如果文件不存在则打开失败 r+ 在r的基础上增加写权限 w 以只写权限打开文件,如果文件不存在则新建,如果文件存在则清空 w+ 在w的基础上增加读权限 a ...原创 2021-11-13 20:09:47 · 157 阅读 · 0 评论 -
C++对二进制文件读写
1、创建类对象,打开文件 使用open成员函数、构造函数打开文件,mode的参数增加 ios::binary2、读写 istream &read( char *buffer, streamsize num ); buffer:存储数据的缓冲区首地址 num:读取多少字节,一般给缓冲区的大小 streamsize gcount(); 功能:获取上一次读取操作读到字节数 ostream &w...原创 2021-11-13 17:40:03 · 1399 阅读 · 0 评论 -
C++对文本文件读写方法
1、创建流对象,打开文件 void open( const char *filename ); void open( const char *filename, openmode mode ); filename 文件名 mode:打开模式 ios::app 添加输出 ios::ate 当已打开时寻找到EOF ios::binary 以二进制模式打开文件 ios::in 为读取打开文件 ...原创 2021-11-13 17:38:29 · 3813 阅读 · 0 评论 -
数据类型的大小
整型: 1、有符号 signed signed char 1 -128~127 signed short 2 -32768~32767 signed int 4 /8 64是8 正负20亿 signed long 4/8 signed long long 8 正负9开头19位...原创 2021-11-12 11:22:29 · 476 阅读 · 0 评论 -
数据存储位置及各位置存储数据类型
text 代码段 二进制指令 只读段 常量 只读的,强制修改会产生段错误 data 数据段 初始化过的全局变量、初始化化过的静态局部变量 bss 静态数据段 未初始化过的全局变量、未初始化化过的静态局部变量 运行前该段会自动清零,默认值是0 heap 堆 由程序员手动管理,缺点:使用麻烦,优点:足够大 stack 栈 局部变量、块变量 ...原创 2021-11-12 11:03:23 · 775 阅读 · 0 评论 -
const和static
const 超出其作用作用域之后,其空间就会被释放,保护变量不被显式的修改 static 表示静态、作用域限于包含它的文件中、变量可以被修改、 1、全局变量前加static变为全局静态变量、未初始化的静态变量自动初始化为0 2、局部变量前加static变为局部静态变量、作用域保持不变 3、函数返回类型前加static为静态函数、静态函数只是在声明他的文件当中可见,不可被其他文件使用...原创 2021-11-11 21:16:13 · 344 阅读 · 0 评论 -
内核链表和普通链表的区别
简单朴素点讲:内核链表是将链表节点放入结构体中,而普通链表是将结构体放入链表中原创 2021-11-11 16:09:17 · 470 阅读 · 0 评论 -
TCP和UDP的区别
TCP:面向连接 可靠 一对一 数据流, 速度慢 用于文件传输UDP: 无连接 不可靠 一对多 报文, 速度快 用于视频,电话,实时原创 2021-11-10 18:41:37 · 1992 阅读 · 0 评论 -
指针相关知识点
指针的运算: 指针变量只有一下运算是有意义的: 指针 + n 前进n个元素 指针 - n 后退n个元素 指针 - 指针 计算出两个指针变量之间相隔了多少个元素,只有类型相同才能相减 指针与const const int* p; int const* p; 保护指向的内存不被修改 int* const p; 保护指针变量不被修改(指向不能修改)...原创 2021-11-09 16:12:22 · 109 阅读 · 0 评论 -
多态、虚函数、纯虚函数
什么是多态: 指的是指令的多种形态,当同一个指令被调用时,它能根据参数、环境的不同做出相应的操作,这种情况叫做多态 根据确定执行哪个操作的最终时间,将多态分为编译时多态、运行时多态一、编译时多态: 当调用重载函数时,编译器会根据函数参数的类型、个数等,在编译器就能确定执行的是哪个版本的重载函数,这个就叫做编译时多态,模板技术也是。二、运行时多态: 当子类覆盖了父类的同名函数,然后用父类指针或引用指向子类对象,并访问虚函数时,它可以根据父类指向那个子类对象,来调...原创 2021-11-09 14:30:36 · 1050 阅读 · 0 评论 -
力扣 剑指offer 24.反转链表
解题思路:定义一个链表节点node为nullptr,一个temp节点来存储head->next,让head->next=node,更新node的值为head,head的值为temp,让head结点循环向后遍历,直到head节点为空,此时的node就是反转后链表的头节点代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; *原创 2021-11-09 10:36:38 · 299 阅读 · 0 评论 -
深拷贝和浅拷贝
拷贝构造也是一种特殊的构造函数,格式为: 类名(const 类名& that) // const可加可不加,但是加更好 { } 什么时候调用拷贝构造: 当使用旧的对象给新对象初始化时,就会自动调用拷贝构造 Test t1; // 调用无参构造 Test t2 = t1; // 自动调用拷贝构造 拷贝构造的任务: 顾名思义拷贝构造负责把旧对象中的成员变量...原创 2021-11-09 08:34:30 · 476 阅读 · 0 评论 -
指针和引用的区别
一、为什么要使用指针: 1、跨函数共享变量(输出型参数),可以用引用代替 2、提高传参效率,引用可代替 3、配合字符串,string可代替 4、配合堆内存,继续使用指针二、什么情况下使用引用: 1、跨函数共享变量,比指针安全(不存在空引用,也极少出现野引用),比指针方便(不需要取地址、解引用) 2、提高传参效率,引用的传参效率比指针还高,因为指针还需要4/8字节存储地址编号,而引用一个字...原创 2021-11-08 20:59:11 · 286 阅读 · 0 评论 -
JZ15 反转链表
/*JZ15 反转链表描述输入一个链表,反转链表后,输出新链表的表头。示例1输入:{1,2,3}复制返回值:{3,2,1}*//*** struct ListNode {* int val;* struct ListNode *next;* };*//**** @param pHead ListNode类* @return ListNode类*/struct ListNode* ReverseList(struct ListNo...原创 2021-08-23 15:27:21 · 60 阅读 · 0 评论 -
力扣 剑指 Offer 09. 用两个栈实现队列 C++
解题思路:用两个栈stack1进数据stack2出数据,出的时候如果stack2为空,stack1不为空,则将stack1中的数据全部导入stack2中代码:class CQueue { stack<int> stack1,stack2;public: CQueue() { while(!stack1.empty()){ stack1.pop(); } while(!stack2.emp.原创 2021-11-03 10:18:48 · 125 阅读 · 0 评论 -
new/delect与malloc/free的区别
1、c++中有专门管理堆内存的语句,c语言中只能使用标准库提供的函数new 分配内存,相当于mallocdelete 释放内存,相当于free2、new在分配内存时允许对内存进行初始化 int* p=new int(val);3、new/delete 不能与malloc/free 混合使用 int* p=new int; free(p);//虽然语法支持,但是不要这样使用 使用new分配内存时会自动调用类、结构、联合的构造函数...原创 2021-11-08 11:10:20 · 136 阅读 · 0 评论 -
内联函数与宏定义函数的异同
一、宏函数 #define FUNC(arg) arg*10 不是真正的函数,就是带参数的宏,使用宏函数的位置会先替换成宏函数后面的代码,然后根据提供的参数替换掉对应参数的位置 注意:可以使用续行符和大括号来保护代码 二义性: 由于宏所处位置或参数不同可能导致宏有多种解释,这就叫宏的二义性 可以在最外层加小括号,每个参数都加小括号,以此降低产生二义性的可能,不要在宏中使用自变运算符 运算符: # 把宏函数的参数变成字...原创 2021-10-18 20:40:52 · 215 阅读 · 0 评论 -
函数重载、覆盖、隐藏、重写的区别
一、覆盖(重写) 如果子类中有与父类的虚函数名相同的成员函数,编译器会比较两个同名函数的格式,如果完全相同,则会把子类中同名函数的地址覆盖父类的虚函数表中的记录,这种情况叫做函数覆盖或者函数重写,如果格式不相同则构成隐藏二、重载在同一作用域下,函数名相同,参数列表不同(参数的个数、类型)的函数构成重载关系函数重载与返回值类型、参数名无关 只有同一个作用域下同名不同参的函数构成重载关系 而不同作用域下的同名函数遵循名字隐藏原则...原创 2021-10-18 20:53:52 · 387 阅读 · 0 评论 -
静态库和共享库
静态库: 就是目标文件的集合,调用静态库就是把静态库中的二进制指令拷贝到可执行程序中 优点:运行速度比共享库,运行时不需要依赖静态库 缺点:最终的可执行文件相对较大,当静态库修改后,可执行文件必须要重新编译共享库: 就是带入口的可执行文件,调用共享库其实就是记录共享库中二进制指令在内存中的位置即可,当可执行文件执行时,共享库会被一起加载到内存中,可执行文件可以跳转到共享库中执行 优点:可执行文件相对较小,当共享库修改后,可...原创 2021-10-19 20:17:36 · 148 阅读 · 0 评论 -
进程间通信和线程间通信
简单的进程间通信:信号、文件、环境变量、命令行参数 命令行、环境变量只能单向传递,信息过于简单,文件时效性差传统的进程间通信:管道文件 是UNIX系统中最古老的进程间通信方式,早期是半双工,现在可以是全双工,是一种特殊的文件,数据会在文件中流动,管道文件无内容时会阻塞读取XSI进程间通信: 共享内存、消息队列、信号量 共享内存:由两个或多个进程之间共享一块由内核维护的内存 优点:是最快...原创 2021-10-20 19:54:37 · 149 阅读 · 0 评论