自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C语言中的 gets,puts,getchar,putchar函数解析

gets,puts,getchar,putchar函数解析

2021-12-06 18:36:34 3459

原创 printf函数和scanf函数

写在前面:在刚开始学习C语言的时候,用的比较多的两个库函数就是printf函数和scanf函数,但是好多同学在用的时候经常会犯一些没有注意到的小错误,但是有的时候这些小错误就是致命的.下来我们一起学习学习这两个C语言中的库函数.一.printf函数函数声明: 发送格式化输出到标准输出stdoutint printf(const char *format, ...)函数返回值:如果成功则返回输出的字符总数,否则返回一个负数.printf函数的调用格式为: printf("格式化字.

2021-12-05 14:04:40 1656

原创 C语言中的函数 | 传值调用和传址调用

写在前面:刚开始学习函数的时候难免遇到参数传递的烦恼,实参和形参该如何区分,传值调用和传址调用的区别到底是什么?面试的时候又该如何表述呢?下面就让我们一起探索吧!一.函数的参数实际参数(实参):真实传给函数的参数.实参可以是:常量,变量,表达式,函数等.不管实参时何种类型的量,在进行函数调用时,它们必须有确定的值,以便把这些值传送给形参.形式参数(形参):形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元).形式参数当函数调用完成之后.

2021-12-05 12:51:19 676

原创 在C语言中if选择语句条件这样写(0 < x < 10) 正确吗?

写在前面:刚开始学习C语言的时候,好多同学在写if条件语句时都会出现类似的问题.但是有的时候却不影响程序的正确运行,有时候却会与我们所料想的结果不一致,这究竟是什么原因呢?下面我们就一起探究探究吧.一.巧合正确的例子二.正好错误的例子三.以上两种情况究竟是什么原因呢?又该如何去写呢?其实0 < x < 5这样的写法并没有错误,但是无意义.因为<的运算符顺序是从左至右,所以0 < x < 5被理解为(0 < x) < 5.那么首先x...

2021-12-04 17:52:49 7877 2

原创 C语言中的函数 | 库函数和自定义函数

写在前面:今天我们需要学习和了解的是C语言中的函数,其中C语言的函数划分为库函数和自定义函数两种.接下来我们一起探究两者之间的关系.一.C语言中函数的分类库函数 自定义函数二.库函数库函数到底是什么呢?顾名思义,可以通俗的理解为库里面的函数.这些函数都是频繁使用的,为了提高编程效率,将一些常用的函数封装成库,后面直接调用使用.想要进一步了解C语言中库函数的同学可以移步下面的网站进行阅览:cplusplus.com - The C++ Resources Networkht.

2021-12-04 17:20:34 4175

原创 C语言中的循环语句 | while循环 for循环 do while循环

写在前面:在上一篇博客中主要讲解了C语言中的分支语句:C语言中的分支语句 | if-else语句和switch语句_HUAERBUSHI521的博客-CSDN博客写在前面:C语言是结构化程序设计语言,无非就包含以下三种结构:顺序结构:选择结构:循环结构:除了这三种再没有其它的了,再要么就是互相嵌套.比如说循环里面有选择等等而我们接下来要学习的就是分支语句和循环语句:分支语句:if语句switch语句循环语句:while循环for循环do while 循环go to循环那么究竟是什么形式才可以称之为语句呢

2021-12-04 16:24:13 1529

原创 C语言中的分支语句 | if-else语句和switch语句

写在前面:C语言是结构化程序设计语言,无非就包含以下三种结构:顺序结构: 选择结构: 循环结构:除了这三种再没有其它的了,再要么就是互相嵌套.比如说循环里面有选择等等而我们接下来要学习的就是分支语句和循环语句:分支语句:if语句 switch语句循环语句:while循环 for循环 do while 循环 go to循环那么究竟是什么形式才可以称之为语句呢?形如 printf("bit"); 1+2;的语句,在C语言中由一个分号隔开的就.

2021-12-01 21:53:21 1848

原创 关键字sizeof和函数strlen的区别

写在前面:在前面的学习过程中,使用到了sizeof和strlen两个比较陌生的名词.那么今天就一起探究学习一下两者,并且对比一下两者都有哪些区别.并且在此之前给大家在推荐一个学习C/C++的网站:cplusplus.com - C++资源网络http://www.cplusplus.com/一.sizeofsizeof(data type);顾名思义,从英语的角度来分析就是什么的大小,其实这个关键字就是用来计算变量或数据类型所占的空间大小.在后面学习C++的时候,sizeof运算符.

2021-12-01 20:18:56 321

原创 C语言中的字符串+转义字符+注释

写在前面:今天我们要学习的是C语言中的字符串以及转义字符,下面我们一起来对这方面的知识结合代码进行探究.一.字符串什么是字符串呢?"hello bit" 形如这样使用双引号引起来的一串字符就称之为字符串字面值,简称为字符串.需要注意的是: 字符串的结束标志是一个\0的转义字符.在计算字符串长度的时候\0是结束标志,不算作字符串内容.这里就很有必要提到字符数组:数组就是用来存放一组相同类型的元素,而字符数组就是存放若干字符的数组.形如 char arr[] = "he..

2021-11-29 18:53:28 1203 2

原创 C语言中的变量与常量

写在前面:今天我们要学习的是C语言中的常量,下面我会一一使用代码进行探究.C语言中的常量可以分为以下几种:字面常量 const修饰的常变量 #define定义的标识符常量 枚举常量下面呢我们用代码分别都实现探究一下一.字面常量#include <stdio.h>int main() { //字面常量 3.14; 10; 'a'; //字符常量 "dajijoa"; //字符串常量 return 0;}字面常量写出来就是已经固定了,不能再修改

2021-11-29 16:25:51 797 3

原创 无序数组的中位数(三种方法)

一.利用排序进行查找中位数基本思路:对数组进行排序,直接访问数组中位数double MIDnum(vector<int>& array) { if(array.empty()) return -1; int midIndex = (array.size() - 1) / 2; sort(array.begin(), array.end()); if (array.size() % 2 == 1) { return (double)array[m

2021-07-22 13:51:55 6198

原创 通过C++封装UdpSocketl类 实现简单的服务端-客户端通信

一.封装UDP实现简单通信#include <iostream>#include <stdio.h>#include <string>#include <unistd.h>#include <errno.h>#include <arpa/inet.h>#include <netinet/in.h>#include <sys/socket.h>using namespace std;cl.

2021-07-15 17:08:57 689 1

原创 通过C++封装TcpSocket类 实现简单的服务端-客户端通信

一.C++封装TcpSocket类#include <iostream>#include <string>#include <netinet/in.h>#include <sys/socket.h>#include <sys/types.h>#include <cstdio>#include <unistd.h>#include <cstdlib>#include <arpa/inet

2021-07-15 17:05:58 2117 1

原创 UDP(面向数据报协议):无连接 不可靠 面向数据报 如何实现可靠的UDP

一.UDP头部信息:特性:无连接,不可靠,面向数据报. 协议字段: 16位源端口号,16位目的端口号:描述数据从哪个进程来,到哪个进程去. 16位校验和: 二进制反码求和算法(检验接收的数据与发送的数据是否完全一致) 16位数据报长度(UDP首部+UDP数据长度): UDP数据包最大长度(包含头部)不能超过64K 2^16 UDP协议sendto接口发送的数据长度不能超过64K-8,UDP协议对于sendto发送的数据直接进行封装头部,发送出去.若

2021-07-14 16:30:23 2959

原创 网络典型协议 命令 技术:ARP协议 DNS协议 ICMP协议 命令:PING/TRACEROUTE/TELNET NAT协议 代理服务 DHCP协议

ARP(地址解析)协议介于数据链路层和网络层之间的协议.作用:ARP协议建立了主机IP地址和MAC地址的映射关系 在网络通信时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃 因此在通信前必须获得目的主机的硬件地址 工作流程: 源主机发出ARP请求,询问某IP地址的主机的硬件地址是多少,并将这个请求广播到本地网段(以太网帧首部的硬件地址填

2021-07-14 11:38:20 519 2

原创 网络层 IP协议 数据链路层

IP: IP协议字段: 4位版本:IPV4 4位首部长度:标记IP报头有多长20~60 8位TOS字段:3位弃用 1位保留 4位服务类型:最小延迟,最大吞吐量,最高可靠性,最小成本 16位数据报总长度:UDP数据段最大大小:64K-20-8 16位分片标识:UDP数据报有可能在网络层进行分片,标识当前分片所在的原始数据报 3位标志:1位保留 1位标识是否禁止分片 1位标识是否还有更多分片 13位分片偏移量:表示当前分片在原始数据中的位置,以

2021-07-14 11:29:15 427 2

转载 TCP(传输控制协议) | 面向连接 可靠传输 提供字节流服务

一.TCPTCP/IP协议栈中传输层的典型协议:TCP(Transmission Control Protocol ):传输控制协议特性: 面向连接,可靠传输,提供字节流服务协议字段信息:16位源端口号,16位目的端口号:负责端与端之间的数据传输 32位序号/确认序号: 进行协议栈中的包序管理+其它功能 4位首部长度: 单位:4个字节 TCP头部最大长度:15(8+4+2+1)*4 = 60字节 TCP头部最小长度:20字节 6位保留 6位标志位: URG:紧急指针是否有效.

2021-07-14 10:37:07 2685

原创 mysql数据库C语言API的简单介绍及应用

一.基本函数及介绍1.初始化数据库连接的实例对象MYSQL* mysql = mysql_init(NULL);2.连接数据库服务器mysql_real_connect(数据库操作句柄,主机地址,用户名,用户密码,数据库名称,端口号,套接字/管道描述符,标志位);示例: mysql_real_connect(mysql,"127.0.0.1","root",NULL,"image_server",0,NULL,0);返回值为空则表示出错3.设置字符集mysql_set_

2021-07-12 17:50:41 288

原创 mysql数据库 | 复合查询 分组查询 联合查询 子查询 合并查询

一:复合查询通常对于统计数量,计算平均值,寻找最大值等操作,都可以通过复合函数来完成 MySQL给出了以下五种聚合函数 AVG(): 返回查询到的数据的平均值 COUNT():返回查询到的数据的数量 SUM():返回查询到的数据的总和 MAX():返回查询到的数据的最大值 MIN():返回查询到的数据的最小值 注意:复合函数仅能作用于数字下面对这个表进行案例演示+----+------+--------+------------+-------

2021-07-12 16:58:55 807

原创 mysql数据库 | 库的简单操作 表的增删查改

一.数据库的操作(1).查看数据库SHOW DATABASES;示例:MariaDB [(none)]> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || performance_schema |+--------------------+3 rows in set

2021-07-10 19:11:32 183 3

原创 mysql数据库 | 数据类型 六大约束 三大范式

一.数据类型mysql的数据类型主要分为数值类型,字符串类型,日期/时间类型三种.数值类型:数值类型可以指定为无符号(unsigned),表示不取负数。 1字节(bytes)= 8bit。 对于整型类型的范围: 有符号范围:-2^(类型字节数8-1)到2^(类型字节数8-1)-1,如int是4字节,就是-2^31到2^31-1 无符号范围:0到2^(类型字节数*8)-1,如int就是2^32-1 尽量不使用unsigned,对于int类型可能存放不下的数据,int unsi.

2021-07-10 14:52:01 767 1

原创 虚拟地址到物理内存的映射 | 分段机制 分页机制 多级页表 多级页表 快表 段页式

一.物理地址

2021-07-10 10:26:46 2424 1

原创 动态内存管理:malloc申请的堆块 new[]和delete[]的底层原理 malloc/free和new/delete的区别

一.new/delete new[]/delete[]的过程new和delete是用户在进行动态内存申请和释放的操作符,operator new 和 operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间.1.1 内置类型如果申请的是内置类型的空间,new的malloc,delete和free基本类似,不同的地方是:new/delete申请的释放的是单个元素...

2021-07-09 19:00:08 415

原创 内核空间:kmalloc vmalloc 用户空间:malloc ptmalloc

一.地址映射流程二.内核空间在内核空间,通过malloc类似的两个系统调用来进行内存的分配,它们分别是kmalloc和vmalloc1.kmallockmalloc用于为内核空间的直接内存映射区分配内存.kmaloc以字节为分配单位,通常用于分配小块内存,并且kmalloc确保分配的页在物理地址上是连续的(虚拟地址也必然是连续的),并且kmalloc为了防止内存碎片的问题,其底层页面分配算法是基于slab分配器实现的.2.vmallocvmalloc用于为内核空间中的动态内存映.

2021-07-09 18:01:31 1168

原创 虚拟地址空间:用户空间和内核空间 物理内存管理:伙伴系统以及slab分配器

一.虚拟地址空间直接使用物理内存面临的问题:内存缺乏访问控制,安全性不足 各进程同时访问物理内存,可能会互相产生影响,没有独立性 物理内存极小,而并发进程所需又大,容易导致内存不足 进程所需空间不一,容易导致内存碎片化问题基于以上几种原因,Linux通过mm_struct结构体描述了一个虚拟的,连续的,独立的地址空间.也就是所说的虚拟地址空间.程序运行时,在建立了虚拟地址空间后,并没有分配实际的物理内存,而是当进程需要实际访问内存资源的时候就会由内核的请求分页机制产生缺页中断,这时才

2021-07-09 16:25:33 1198 1

原创 事务 | ACID特性 事务并发带来的问题 隔离级别 数据库的实现:redo log undo log

事务在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。在MySQL中MyISAM引擎并不支持事务,所以这里指的主要是InnoDB引擎ACID谈到事务,那肯定少不了ACID的特性,ACID是以下几个单词的缩写,下面一一对其进行介绍 原子性(atomicity):指事务是一个不可分割的工作单位,事务中的操作要么都发送,要么都不发生. 一致性(consistency):事务操作前与操

2021-07-06 09:26:59 192 1

原创 memcpy的实现以及浅拷贝问题的探究

一.memcpy的实现函数原型:void* memcpy(void* dest,void* src,size_t num);函数作用:函数memcpy是从src的位置向后复制num个字节的数据到dest的内存位置 遇到'\0'的时候并不会停下来 如果src和dest有重叠,则复制的结果都是未定义的函数实现:void* memcpy(void* dest, void* src, size_t num) { void* ret = dest; assert(dest); a

2021-07-03 20:52:35 1215

原创 DNS域名解析流程 打开一个URL发送了什么?

一.DNS域名解析流程DNS中的递归查询和迭代查询:递归查询: 是一般主机和本地域名服务器之间属于递归查询.就是当主机所询问的域名本地服务器不知道的时候,本地服务器就会一DNS客户的身份向其它域名服务器发出查询请求,直到得到结果并转交给主机 迭代查询: 一般DNS服务器之间属于迭代查询. 假如DNS服务器A不能响应DNS服务器B的请求,那么它就会告诉服务器B下一步应该去找哪个DNS服务器,然后进行后续的查询.域名解析过程:主机会先在浏览器缓存中进行查找对应关系,如果找不到则到本机的hos

2021-07-03 17:38:04 175

原创 sizeof与strlen的区别

一.sizeofsizeof是一个关键字,是编译时运行符(值在编译时就计算好了),用于判断变量或者数据类型的字节大小.sizeof(data type);其中,data type是要计算大小的数据类,参数可以是数组,指针,类型,对象,函数等由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。具体而言,当参数分别如下时,sizeof返回的值表示的含义如

2021-07-02 17:44:55 1262

原创 字符指针 数组指针 指针数组 函数指针 函数指针数组 指向函数指针数组的指针 回调函数 &数组名VS数组名

一.前言指针的概念:指针就是个变量,用来存放地址,地址唯一标识一块内存空间 指针的大小是固定的4/8个字节(32位平台/64位平台) 指针是有类型的,指针的类型决定了指针的+-整数的步长,指针解引用操作的权限二.字符指针&字符数组&字符串字符数组就是元素为字符变量的数组,而字符串则是以'\0'(ASCii码值为0x00)为结束字符的字符数组.字符数组并不一定是字符串.'\0':用来标记字符串的结束int main() { //一般使用方法: char

2021-07-02 16:38:59 113

原创 vector | reserve和resize方法的区别 以及 增容机制

一.reverse和resize方法的区别函数原型:void reserve(size_t n); //扩增容器的容量void resize(size_t n); //改变容器内的有效元素个数reserve:如果n大于容器现有的容量(即capacity()),则需要在自由内存区为整个容器重新分配一块新的更大的连续空间,其大小为n*sizeof(T).然后将容器内所有有效元素从旧位置全部复制到新位置(调用拷贝构造函数),最后释放旧位置的所有存储空间并调整容器对象的元素位置指示器.(vect

2021-07-01 15:00:44 1080

原创 简易线程池的实现

一.线程池线程池:大量线程(数量存在上限)+线程安全的任务队列T1(线程创建)+T2(任务处理)+T3(线程销毁) = T(任务处理总时间)在一个任务处理的总时间中,若T1+T3所占用的时间占用大量的比例,也就意味着大量任务的处理中,资源被浪费在线程的创建和销毁中,这是不合理的.因此产生了线程池,创建出大量线程(并不退出),而是不断将任务交给这些线程进行处理.避免了大量线程创建/销毁所带来的时间成本.线程池中线程的数量是有上限的,避免出现峰值压力,瞬间资源被耗尽导致程序崩溃的危险.

2021-07-01 09:07:14 100

原创 生产者消费者模型的两种实现方式 | 互斥锁+条件变量实现 信号量实现

一.生产者消费者模型设计模式:针对典型的应用场景设计的解决方案应用场景: 大量的数据产出以及处理的场景优点: 解耦合,支持忙闲不均,支持并发解耦合:模块分离,降低功能耦合度 支持忙闲不均: 中间缓冲区队列,在压力大的时候缓冲大量数据,然后慢慢处理 支持并发: 支持多对多,前提是中间缓冲区的操作必须是线程安全的一个场所,两种角色,三种关系.最关键的实现:场所(线程安全的数据队列(缓冲区))实现一个线程安全的数据队列(缓冲区),创建两种角色线程各自完成队列访问.二.互斥锁+条件

2021-07-01 09:06:36 421

原创 引用与指针的区别

int main() { int a = 10; int *p1 = &a; int& p2 = a; return 0;}

2021-06-30 21:50:24 30780 7

原创 线程安全 | 互斥锁 条件变量 信号量

一.什么是线程安全?如何实现线程安全?同一进程中的线程都拥有自己独有的栈,一组寄存器,程序计数器等,但是线程安全: 多个线程对临界资源的访问操作是安全的线程安全的实现:同步与互斥互斥: 同一时间只有一个线程能够访问临界资源,实现临界资源访问的安全同步: 使多个线程按照某种规则时序进行调度,实现对临界资源访问的合理性互斥的实现: 互斥锁,信号量同步的实现: 条件变量.信号量二.互斥锁pthread_mutex_t mutex; //定义互斥锁 pthread_mu

2021-06-30 21:06:47 241 2

原创 线程 | 线程控制 线程与进程区别 多线程/进程进行多任务处理的优缺点

概念:线程是进程中的一条执行流,是CPU执行调度的基本单位.线程是进程中的一条执行流,一个进程中可以有多个流程.然而Linux下的线程执行流是通过pcb实现的,且一个进程中可能有多个pcb,并且这些pcb共享同一个进程中的大部分资源,相较于传统pcb更加轻量化,因为线程也被称为轻量级进程.Linux环境下:线程是CPU执行调度的基本单位 进程是系统进行资源分配的基本单位 线程共享进程数据,但也要拥有自己的一部分数据线程之间的独有与共享:共享:虚拟地址空间(代码段和数据段),文件描述符表

2021-06-30 21:02:09 700 1

原创 进程 | 进程概念 进程控制:fork函数详解(深入底层实现原理) vfork函数

一.PCB(进程控制块)详解进程就是一个运行当中的程序. 程序本来存储在磁盘中,当我们执行它的时候,先把它读取到内存当中,再然后放到寄存器中,最后让CPU执行程序.这个时候程序就变成了一个进程.二.fork函数在Linux中,fork函数是非常重要的函数.从一个已存在的进程中创建一个新进程.新进程为子进程,而原进程称为父进程.fork函数原型:#include <unistd.h>pid_t fork(void);一次调用,两次返回.两次返回的区别是子进.

2021-06-30 20:33:27 1118 1

原创 五种高级IO | select poll epoll 水平触发模式 边缘触发模式 惊群问题

一.高级IO在介绍多路复用IO之前,先介绍一下其它四种高级IO:阻塞IO: 在内核将数据准备好之前,系统调用会一直等待.所以的套集字默认是阻塞方式. 非阻塞IO: 在内核还未将数据准备好,则系统调用仍然会直接返回,并且返回错误码. 信号驱动IO: 内核将数据准备好的时候,使用SIGIO信号通知应用程序进行IO操作 异步IO: 由内核在数据拷贝完成时,通知应用进程 (信号驱动IO则是告诉应用进程开始拷贝数据)注意:几种IO效率越来越高,但是流程控制越来越复杂,占用的资源也越来越多.重点

2021-06-28 18:17:31 1099 1

原创 Linux | iNode节点 文件描述符表 文件表

一.iNode节点通常情况下,文件系统会将文件的实际内容和属性分开存放:文件的属性保护在iNode节点中,每个iNode都有自己的编号.每个文件各占用一个iNode.不仅如此,iNode中还记录着文件数据所在的block块的编号 文件的实际内容保存在block中(数据块),每个block也有属于自己的编号. super block(超级块)用于记录整个文件系统的整体信息.包括:iNode和block的总量,已经使用量和剩余量,以及文件系统的格式和相关信息每个inode都有一个号码,操作系

2021-06-26 20:18:18 1070 3

原创 C++多态: 抽象类 多态的原理 虚函数表 动态绑定和静态绑定

一.抽象类如果在虚函数的后面加上=0,并且不进行实现,这样的虚函数就叫做纯虚函数.而包含纯虚函数的类,也叫做抽象类或者接口类.抽象类不能实例化出对象,因为它具有的信息不足以描述一个对象,派生类继承后也只有在重写纯虚函数后才能实例化出对象.抽象类就像是一个蓝图,为派生类描述好一个大概的架构,派生类必须实现完这些架构,至于要在这些架构上做些什么,增加什么,都是派生类自己的问题.class preson { virtual void print() = 0;};class stu

2021-06-26 18:09:17 608 4

空空如也

空空如也

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

TA关注的人

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