自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 数据库基础

数据库分类:数据库大体可以分为 关系型数据库 和 非关系型数据库关系型数据库(RDBMS):简单来说,关系模型指的就是二维表格模型,而一个关系型数据库 就是由二维表及其之间的联系所组成的一个数据组织。常用的关系型数据库如:1. Oracle:甲骨文产品,适合大型项目,适用于做复杂的业务逻辑,如ERP、OA等企业信息系统。收费。2. MySQL:属于甲骨文,不适合做复杂的业务。开源免费。3. SQL Server:微软的产品,安装部署在windows server上,适用于中大型项目。

2022-04-18 17:08:30 595 2

原创 云备份项目

目录项目实现目标设计:项目环境:使用到的库:Jsoncpp 库:使用方法:Bundle 库:使用方法:Httplib 库:使用方法:C++17 filesystem库:模块的实现:服务端数据管理模块:服务端热点管理模块:服务端网络通信模块 与 业务处理模块:客户端数据管理模块:客户端目录检查模块:客户端网络通信模块:项目的不足及改进思路:项目源码:项目实现目标设计:服务端程序: 部署在linux服务器上实现针对客...

2022-03-20 21:41:57 1627

原创 传输层: UDP 与 TCP协议

可以说应用层负责规定应用程序之间沟通的方式. 那传输层负责数据能够从指定源端口发送到指定对端口.UDP协议:udp协议格式(实现):16位源端端口:描述源端处理进程是谁. 16位对端端口:描述对端处理进程是谁,源端与对端端口描述了是哪两个进程之间在进行传输16位数据报长度:即报文长度, 为报头长度+实际数据长度,所以实际的数据长度是报文长度减8;因为udp协议限制了报文最大不超过64k. 则报文中数据大小(上层所sendto给予的大小)必须小于64k-8。否则就会丢弃数据报错...

2022-02-09 21:05:32 1471

原创 应用层: HTTP 与 HTTPS协议

http是应用层的协议, 应用程序之间数据格式的约定统一格式, 由程序员们自己约定协议可以用自定制协议也可以是已有的、优秀的知名的协议.http协议就是大佬们弄好的针对典型应用的知名的nb的协议.(应用层的知名的协议还有: http 超文本传输协议,https 解密的http, ftp 文件传输协议, smtp 邮件传输协议, dns 域名解析协议)自定制协议: 我们可以自己随便定义使用的数据格式, 但是要高效就得考虑: 序列化,反序列化的传输性能和解析性能问题. 序列化后的二进制数据越短传输.

2022-02-08 18:45:39 1858

原创 C++: 多态

多态的实现: 1. 父类要有虚函数(虚函数就是被virtual修饰的函数) 2. 子类对父类虚函数进行重写, 重写: 函数返回值, 函数名, 函数参数都相同.(子类重写时可加virtual也可不加,规范性问题),重写也可以叫覆盖.如果即使子类中达成了三同条件, 但基类函数不是虚函数, 就不构成多态, 只构成同名隐藏(同名隐藏只需要函数名相同.)除三同条件外达成重写的情况:1.协变: 派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生.

2022-01-14 22:02:14 507

原创 socket网络套接字编程

套接字编程: 即网络通信程序的编写.网络中的通信都是两端主机之间的通信: 客户端和服务端客户端:网络通信中用户的一端,是进行业务请求的一端,是主动发起请求的一端服务端:网络通信中提供服务的一端,针对客户端请求进行处理的一端,是被动接收请求的一端qq聊天并不是自己跟另一个手机或者电脑用户在通信,实际上是跟腾讯的服务器在进行通信,把一个消息发到某个群,其实是把数据发送给了服务器,描述了数据在哪个群,服务器就能找到群里有哪些用户,这些用户也登录了服务器,就可以把数据逐一发送给对应的主机。不存在客户端.

2022-01-12 22:05:10 2451 6

原创 C++: 继承

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类(子类), 被继承的称为基类(父类)。子类继承了父类除构造函数和析构函数之外所有的成员变量和成员方法, 不论是公有的还是私有的、保护的. 相当于除了构造和析构函数之外所有成员全都拷贝一份到子类中. (但能不能访问和有继承到是另一回事.)继承的形式:class base {};class a:public base { //

2022-01-07 20:01:05 684

原创 C++: 模板

为了实现泛型编程 (比如不同类型通用的函数), C++引入了模板的概念.使用时在函数或类实现前(上一行), 加上template<typename T1, typename T2,......,typename Tn>(typename可以换成class), 表示T1是一种类型,T2是另一种类型. 这样就成了一个模板.函数模板与类型无关,函数模板不是一个函数,类模板不是一个类, 他们在使用时被参数化,根据实参类型才产生具体的函数或类. 所以每用一个不同类型了模板, 编译时编译器会..

2021-12-14 19:40:54 1073

原创 Linux: 多线程

线程概念:线程是进程中的一条执行流程.在linux之前学习进程的时候 ,进程就是一个pcb, 但是在现在学习线程的时候, 发现线程是进程中的一条执行流,而因为linux下执行流是通过pcb来完成的,所以理解pcb是linux下的执行流,反推得到了一个结论,linux下的一个pcb是一个线程。只不过人家linux下通常不谈线程,而叫做轻量级进程. ( 有些地方认为Linux没有真正的线程的说法, 线程实际上是一个轻量级进程. )从另一个角度来说:线程是cpu调度的基本单位, 进程是资源分.

2021-12-04 19:20:50 4580

原创 Linux: 信号, volatile关键字, 可重入不可重入函数

信号:信号与信号是两个不相干的技术点. 信号是一种事件通知机制, 通知某个进程打断当前操作去处理某个这个事件. 信号量是进程通信处理同步与互斥的机制,本质是一个计数器, 记录了临界资源的数目.kill -l ,指令查看所有62种信号前31种(1~31号)是非可靠/非实时信号, 后31种(34~64号)是可靠信号/实时信号 两者的区别就是在信号注册时, 非可靠信号: 非可靠信号如果已注册则什么都不做(信号丢弃,不会注册第二次), 没注册过则注册. 可靠信号:不论是否注册过...

2021-11-26 22:20:41 943

原创 Linux: 进程间的通信IPC (systemV)

进程之间具有独立性, 无法直接通信, 但是在日常工作中我们通常需要多个进程协同工作.进程通信的分类(systemV标准): 管道 PIPE, 共享内存, 消息队列, 信号量所有进程通信方式的本质:是内核空间中的一块缓冲区(内存). 管道:管道本质:是内核空间中的一块缓冲区(内存). 内核空间是一块公共区域, 多个进程通过访问这个公共区域内的缓冲区实现进程通信管道特性: 1半双工通信, 可以选择方向的单向通信(用户决定哪个进程读哪个进程写).2生命...

2021-11-19 21:18:21 708

原创 Linux: 基础IO , 重定向 , 静态库与动态库

1

2021-11-10 22:25:42 1455 2

原创 c++内存管理:new与delete,深拷贝与浅拷贝

new和delete:new会返回申请空间的指针.以下代码段等价:int main() { int* n = (int*)malloc(sizeof(int)); assert(n != NULL); *n = 1; free(n); int* m = new int(1); delete m; int* n = (int*)malloc(sizeof(int)*4); assert(n != NULL); free(n); int* m = new int[.

2021-10-30 20:47:38 823

原创 Linux:进程概念和进程控制

kill命令对僵尸进程没用.孤儿进程不占据当前程序运行的会话,在后台运行(当前会话能打指令)1号进程(init)是负责任的进程,所以孤儿进程退出不会成为僵尸进程,可以被kill掉孤儿进程设置了自己的会话空间后成为守护进程(精灵进程),会话空间是问号"?",脱离了终端运行....

2021-10-29 22:39:06 3408

原创 c++类与对象:static, 友元(输入输出运算符重载) ,初始化列表 , explicit关键字,内部类.

初始化列表:class a{public: a(int n,int v):_data(n),_b(v){ _data=n; _b=v; }private: int _data; int _b;};只能在构造函数后面写初始化成员列表成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关,比如:class A{public: A(int a) :_a1(a),_a2(_a1){

2021-10-22 22:07:13 208

原创 C++类与对象(初阶):类的定义,大小,和六个默认成员函数、this指针.

1

2021-10-18 22:09:58 323

原创 Linux常用基础指令、Linux常用工具(软件包)使用带图详解

1

2021-10-03 16:26:27 631

原创 C++初学

1.重载:C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。函数重载要求参数不同!而跟返回值没关系。2.缺省参数:声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。半缺省参数必须从右往左依次来给出,不能间隔着给(就是只能前面的形参没有默认值,有默认值的在后面),缺省参数不能在函数声明和定义中同时出现.3.命名空间:一个命名空间就定义了一个新的.

2021-09-25 20:06:13 155

原创 各大排序算法

堆排序//堆排序,数组视为堆结构//创建大堆,然后把堆顶和堆尾交换,视堆元素少一,再创建大堆,再交换,再减堆尾,依次可得void _ShiftDown(int ar[], int left, int right, int start){ int n = right - left; int i = start; //父节点 int j = 2*i + 1; //左子树 int tmp = ar[i]; while(j < n) { if(j+1<n &&a

2021-09-13 21:35:17 592

原创 二叉树和堆的创建以及各种操作

1

2021-08-31 15:39:09 143

原创 顺序表,不带头单循环链表,带头双循环链表,顺序栈,链栈,循环队列,链队的实现及用栈实现队列,用队列实现栈.

1.顺序表

2021-08-21 20:28:35 150 1

原创 文件操作及用例(通讯录终级版)

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件(打开看不懂的,乱码)。如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件(看得懂的)。文件指针:每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态 及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE.在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向

2021-07-10 22:08:39 150 1

原创 动态内存管理的几道面试题

首先了解动态内存管理:

2021-07-09 20:34:19 127 2

原创 结构体内存对齐*(加一点位段,枚举,联合体学习)

1

2021-06-20 17:04:55 126

原创 几个str,mem函数的模拟实现

1

2021-06-14 13:56:49 107

原创 指针的八道笔试题

1int main(){ int a[5] = { 1, 2, 3, 4, 5 }; int *ptr = (int *)(&a + 1); printf( "%d,%d", *(a + 1), *(ptr - 1)); return 0;}

2021-06-12 21:33:14 125 3

原创 sizeof,strlen笔试题解析

退格的是个人写错或者觉得值得一看的#include<stdio.h>#include<string.h>//sizeof()算的是()内类型大小,算\0//strlen()算的是()内填的位置到\0的长度(大小),不算\0//char**类型加几就是跳过几个char*,类似int*加几就是跳过几个int//比如数组传参的时候数组名隐式转为了指针,我们通过解引用操作原数组会用到*(arr+n)就得到了第n+1个元素的值int main() { //多看退格的prin

2021-06-05 17:48:28 135 1

原创 指针进阶理解

1.字符指针字符指针需要了解得比较少,下面直接用一个笔试题理解:#include <stdio.h>int main(){ char str1[] = "hello bit."; char str2[] = "hello bit."; char *str3 = "hello bit."; char *str4 = "hello bit."; if(str1 ==str2) printf("str1 and str2 are same\n")

2021-06-01 23:17:12 204 2

原创 整型在内存中的存储

第一题,a和b以%d的形式打印会发生隐式类型转换,高位补符号位,但b是无符号类型,高位补0,于是情况为第二题:%u打印的是无符号整数,相当于unsigned int.char类型能表示的范围是-128~127,此时a在内存存储如图这里十六进制80转为二进制就是1000 0000,就是char能表示的最小值,int和这一样int能表示的最小值就是1后面31个0的二进制.和上面第一题不一样的是上面unsigned char转int 由于unsigned所以高位补0,这里char转unsigned .

2021-05-21 23:28:06 123 2

原创 结构体的初步学习

结构体初始化和复制问题:#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>typedef struct Student { int num; char name[1024];}Student;int main() { Student student = { 10,"张三" }; printf("%d,%s\n", student.num, student.name); //结构体初

2021-05-15 17:35:52 124

原创 含自动展开的扫雷,恶搞关机小游戏

1

2021-05-05 14:15:57 110 3

原创 三子棋,猜数字小游戏

猜数字:#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<time.h>void caishuzi(){ int a = 0; int toguess = rand() % 100 + 1; printf("请开始猜数字\n"); while(1){ scanf("%d", &a); if (a == toguess) { print

2021-04-30 11:06:57 134 1

原创 递归的初步理解

1

2021-04-23 23:27:54 141

原创 指针,解引用操作的初步了解

1

2021-04-22 22:50:47 421 1

原创 小练习

1.计算n的阶乘#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>int main(){ int n = 0,b=1; printf("请输入一个整数n\n"); scanf("%d", &n); int i = 1; for (; i <= n; i++) { b = i * b; } printf("n的阶乘为:%d", b); return 0

2021-04-15 21:56:23 88 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除