自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL事务管理

( Transaction):由一次或者多次基本操作构成,或者说,事务由一条或者多条SQL语句构成。这些语句在逻辑上存在相关性,这一组SQL语句要么全部成功,要么全部失败,是一个整体。防止多个事务并发执行时由于交叉执行而导致的数据不一致。事务的隔离分为括)、)、()和)在事务开始之前和事务结束以后,数据库的完整性没有被破坏。事务处理结束后,对数据的修改就是永久的。

2022-11-23 16:04:33 375 4

原创 TCP的三次握手与四次挥手

第一次握手表明client端具有发送数据的能力,第二次握手表明server端具有接受数据和发送数据的能力,第三次握手表明client端具有接受数据的能力。所以三次握手是可以验证client端和server端的接受和发送能力的最小握手次数。如果只有一次握手,那么client端无法确认server端是否收到了消息,因此client端可能会多次发送报文。同样,如果只有两次握手,那么server端无法确认client端是否收到报文,从而使server端多次发送报文。(造成SYN洪水)如果进行。

2022-10-24 12:51:49 939

原创 虚拟地址与物理地址

我们可以看到子进程会对num的值进行修改,父进程和子进程中num使用的地址空间是相同的,但是如果二者的地址相同,任意一个进程对该地址内存储的数据进行修改后,另一个进程再访问时,访问的应该就是被修改的值,不过此时我们看到的却是二者虽然共用一个地址空间,但是其中一个修改并不会影响到另一个进程访问的结果。的,每个页表映射的是物理空间不同的区域,所以只要页表不同,就算进程的虚拟地址相同,进程间也不会相互干扰,保证了进程的独立性。CPU访问的也是虚拟地址,它需要通过页表找到对应的物理地址,再访问物理地址。

2022-09-10 11:08:56 1706

原创 lambda表达式

在调用一些函数的时需要将另一个函数作为参数传入,这些函数只能有参数(一元谓词)或参数(二元谓词),但是有的时候我们需要传入这个函数,这时候我们就可以使用lambda表达式来避免这个问题。

2022-09-04 20:17:33 1314

原创 const限定符与constexpr

为了将n1能绑定一个整型,需要将d的double转换成int类,但是我们不能直接的修改d的类型,所以编译器会产生上面的这份代码,让n1绑定一个临时量,而这个临时量又被const修饰,所以n1也需要被const修饰。我们将被const修饰过的引用称为对常量的引用,该引用不能被用作修改其所绑定的对象,但是可以通过其他的途径来改变引用对象的值。(如a未被const修饰,b是a的别名,所以可以通过修改a的值来改变b的值。顶层const:像常量指针这样的,指向的对象能被修改,但是指针不能被修改。

2022-08-23 17:01:51 454

原创 C++模板

为了提高代码的复用率,C++中引入了模板--告诉编译器一个模版,让编译器根据不同的类型利用该模板来生成代码。函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本,以此来提高代码的复用率。模板格式:template,T1,T2...就会根据所传实参的类型来产生特定的版本。是定义模板的,也可用。.........

2022-08-09 11:42:20 257

原创 类的静态成员

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。

2022-08-06 12:11:41 644

原创 初始化列表

由于构造函数的本质是对成员变量进行赋值,而并非进行初始化,因此如果成员函数中有const修饰的变量的话,就会导致该变量无法成为我们想要的值。由于_a2是先进行声明的,所以先对其进行初始化,但是此时的_a1还未被初始化,所以_a2被初始化为了一个随机值。const修饰的变量只有一次修改的机会,那就是在初始化的时候,而初始化列表可以将成员变量初始化为你所需要的值。值得注意的是,初始化列表并不是根据初始化列表中的顺序来进行初始化的,而是根据。由于不含有默认构造函数,但是使用初始化列表也可将其初始化,因此我们。..

2022-08-06 10:53:34 181

原创 linux调试器--gdb

linux调试器

2022-07-30 11:23:45 145

原创 vim常用指令

/关键字」先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。「#」「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,在末行模式输入10,就会跳转到第10行。「q」按「q」就是退出,如果无法离开vim,可以在「q」后跟一个「!按「R」替换光标所到之处的字符,直到按下「ESC」键为止。.........

2022-07-22 14:35:45 3315

原创 类和对象与this指针

其实真正的储存方式和上面的这种很像,都是只创建一份成员函数,只是并不是通过指针去调用,而是将成员函数编成一个函数表,在编译链接的时候就能根据函数名去公共代码区找到函数的地址来进行调用。如果成员函数是储存在类内部的话,那么当一个类创建多个对象时就会创建多个成员函数,但是这些成员函数是相同的,这样做会浪费掉空间,所以储存的方式肯定不是此种。在调用成员函数的时候,会默认把对象的地址传过去,用this来接收,这样就可以访问本对象的成员函数了。,当对象调用成员函数时,将对象地址作为实参传递给this形参。...

2022-07-21 18:11:08 162

原创 extern “C“的作用

在写一个项目时,我们很可能遇到这样的一种情况就是,需要调用之前写的c/c++的函数,但是此时你用的恰好不是这一种语言,此时如果直接将这个库添加到你所写的项目中,那么有很大的可能会报出链接错误。这是因为c++需要支持重载,所以在编译的时候会将函数名改变。 因此,extern“C”的作用就产生了,他可以让其包含的部分按c的语法来进进行编译。在c++文件中引用c的函数时,我们就可以用extern “C”来声明一下。但是在c的项目中调用c++写的函数的话,这用用法显然是行不通的,因为c++包含c的语法,而c却

2022-07-10 10:45:47 262

原创 中心扩散法寻找最长回文子串

假设现有字符串arr[]="12HHHHA",需要从字符串中找到最长的回文子串。首先我们 从第一个数开始,判断这个数的两侧的字符是否相同,如果相同回文数组的长度就会扩大2,如果不相同就判断下一个数。但是如果中心是几个重复的字符且数量为偶数个,那么这种向两边判断的方法就失效了,因此在遇到这种情况时,需要额外的处理一下。因为这些字符相同,所以这些字符肯定能组成一个回文字符串,因此我们可以++right来跳过这......

2022-06-25 10:30:39 378

原创 约瑟夫环问题(丢手绢问题)

假设现在有9个孩子,给他们进行编号为0-8,让他们从1开始报数,每当有人报到3的时候就会出局,即n=9,m=3.在进行第一次报数的时候编号为0的孩子先报,所以编号为2的孩子报的数就是3,因此编号为2的孩子出局,然后编号为3的孩子重新开始报数。这里我们可以用%来进行扩充,如1可以看做10%9的结果。通过对比f(9,3)第一次报完数后的结果与f(8,3)之间的关系,我们可以发现f(9,3)=( f ( (8,3)+3) )%9,因此我们可以将f(9,3)的.........

2022-06-24 09:55:11 850

原创 常见排序算法

假定一数组 arr[] = { 9,8,7,6,5,4,3,2,1 } 需改为升序排列。我们可以将这个数组分为两个部分--已排序的部分和未排序的部分,而第一个元素是已经排好的。然后再用第一个未被排序的元素n与已经排序的最后一个元素m进行比较,如果n......

2022-06-07 16:16:34 182

原创 堆排序--升序与降序

现有一个数组arr,我们需要按升序来对它进行排序。arr[]={9,1,3,5,7,2,4,6,8}在建堆之前,我们需要先考虑一个问题--是建大堆还是建小堆,以及建堆时需要向上调整还是向下调整?首先我们假设建大堆,而建大堆又分为两种情况:如果是向上调整的话只需要我们从第二个元素开始,依次进行向上调整,直至最后一个元素。若是选择向下调整的话,只需要从最后一个元素的父节点开始即可。因为向上调整的时间复杂度为O(N*logN),而向下调整的复杂度为O(N),所以我们较多使用向下调整。

2022-05-20 16:57:09 2390

原创 快慢指针判断环形链表

141. 环形链表 - 力扣(LeetCode) (leetcode-cn.com)我们判断的结果无外乎两种情况----是环形链表或不是环形链表。因此如果有个指针指向了NULL,那么就证明了这不是个环形链表。但是如果要是环形链表,那么指针就会在环中一直寻找NULL,因此程序就会陷入死循环,这里就需要用快慢指针来解决这个问题。slow=slow->next;fast=fast->next->next;这里我们可以理解为fast与slow两人正在跑步,...

2022-05-06 18:24:30 645

原创 双指针之快慢指针

1.给定一个头结点为head的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。(876. 链表的中间结点 - 力扣(LeetCode) (leetcode-cn.com))这里我们只需要在slow向后找一个的时候,fast向后找两个节点,直到fast或fast->next指向NULL。这时slow所指向的节点就是所需的节点。struct ListNode* middleNode(struct ListNode* head){struct List...

2022-04-28 18:02:00 1214

原创 模拟实现strstr

首先我们先试着将两个数组直接的进行比较,如果不相等就使i++找下一位,直到两个字符串中有字符相等,才让j++来比较下一个字符。但是这种判断方法存在一定缺陷:如果出现不同的字符时,只将 j 的值还原为0而不管 i 的值,那么就有可能跳过一些字符,从而导致结果出错,就比如下面这种情况:因此我们用一个pos来储存第一次判断时 i 的值,这样我们就可以拿到第一次判断时的下标,这样如果判断为不相等的话就可以返回到第一次判断的位置。int strStr(char * haystack, ch...

2022-04-23 18:31:43 240

原创 程序的编译之预处理详解

在之前的文章中介绍了程序的编译和链接这两个过程(详见http://t.csdn.cn/39SPf),那么这篇文章我就带大家来详细的了解一下预处理这个过程。目录​一、#define二.#和##三.命令行定义四.条件编译五.文件包含首先,大家先要了解一些可能需要用到的预定义的符号:一、#define1.#define 定义标识符#define name stuff如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。我...

2022-04-10 17:50:12 470

原创 被错误使用的feof

很多人看到了这个函数中存在一个eof,就将这个函数认为是用来判断文件是否结束的。然而这种看法是错误的,他的真正用法是测试给定流 stream 的文件结束标识符,即测试时什么原因让文件的读取结束的。我们可以通过下面这段代码,来了解一下文本文件读取时feof是如何来判断的。int main()//文本文件读取是否结束,判断返回值是否为 EOF,或者 NULL{ int c; FILE* fp = fopen("test.txt", "r"); if(fp==NULL) {

2022-04-08 23:27:53 522

原创 文件的随机读写及文件缓冲区

一. 文件的随机读写我们在使用完文件指针的时候,指针指向的是数据的末尾,那么如果要更改这个指针的位置,我们就要了解这几个函数:fseek(根据文件指针的位置和偏移量来定位文件指针),ftell(返回文件指针相对于起始位置的偏移量),rewind(让文件指针的位置回到文件的起始位置)。首先我们通过fseek来看一下接下来需要用到的几个参数:指针的位置我们可以用这三个来确定指针位置SEEK_CUR 文件指针当前的位置 SEEK_END 文件末尾的位置 SEEK_SET 文件开始...

2022-04-08 23:01:32 1236

原创 简析程序的编译及链接

在运行一个程序时,我们知道,计算机并不能直接的读懂我们所写的代码而是需要将其进行编译和链接,这样才能使机器读懂我们需要干什么。这篇文章我将带大家了解一下在这两个过程中都会发生哪些操作。下图为本篇文章概览。首先用gcc创建一个test.c和一个add.c的文件。#include<stdio.h>#define Num 10//定义Numextern int add(int,int);int main(){ int a = 1; int b = 2.

2022-04-08 16:30:51 171

原创 三分钟带你了解浮点数的存储方式

首先我们先来看一下下面这段代码。通过对比①与③所打印出来的结果,可以知道浮点型和整型数据在内存中的存储方式并不相同。这里我们将浮点数float_n转化为(-1)^S*M*2^E这种形式来观察。​​​​​​​其中(-1)^S表示符号位,如果S=0,则表示该浮点数为正数;当S=1时,浮点数为负数。 M为有效数字,M大于等于1,小于2 2^E表示指数位所以十进制的5转化为二进制就是101.0,按照上面所说的进行转化,就是1.01*2^2;十进制的-5转化后就是-1.01*2^2。...

2022-03-31 17:02:37 757

原创 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。编写一个函数找出这两个只出现一次的数字。(寻找两个单身狗)

首先创建一个数组{1,2,3,1,2,3,4,5},其中只出现了一次的数字为4,5。因为这个数组只有两个元素不同,所以我们可以将整个数组的进行元素异或,假设结果为ret,那么ret就等于这两个只出现过一次的数字进行异或的结果。因此我们可以知道这两个数哪一位是不同的,然后我们再根据这个不同的二进制位进行分组(该位上为1的分一组,为0的分一组)。我们任取一组进行异或,其结果就是所求的其中一个数字,将这个数字与ret异或即可求得另一个数字。void find(int* arr, in

2022-03-30 16:56:32 750 1

原创 一招教你区分malloc,calloc,realloc以及new的区别

malloc在msdn中的描述为Allocates memory blocks.我们可以向该函数传入一个值n,然后malloc函数就会在堆区申请一个n个字节的空间。void *malloc(size_t n) calloc的描述为Allocates an array in memory with elements initialized to 0.根据描述我们可以看出calloc在申请空间时会将该空间初始为0。而它需要的参数为:n-要被分配的元素个数,m-元素的大小。void *calloc

2022-03-29 15:12:55 730

原创 联合体两个例题

1.int main(){ union { short k; char i[2]; }*s, a; s = &a; s->i[0] = 0x39; s->i[1] = 0x38; printf(“%x\n”,a.k); return 0;}short和char共用两个个字节,对进行修改也会对k进行修改。低地址在低处,所以39是低地址,38为高地址,打印出来为3839。2.union Un{ short s[7

2022-03-25 13:54:21 673

原创 位段(两个例题)

1.int main(){ unsigned char puc[4]; struct tagPIM { unsigned char ucPim1; //下面为位段共用1字节 unsigned char ucData0 : 1;//1 unsigned char ucData1 : 2;//00 unsigned char ucData2 : 3;//101 }*pstPimData; pstPimData = (struct tagPIM*)puc; memset(.

2022-03-25 13:15:46 318

原创 结构体大小计算(结构体的对齐规则)

假如我们在vs的环境下来求sizeof(struct B)struct B{ int a; short b; char c; int d;};在不知道结构体类型的存储方式时,我们会认为他的大小为两个int类型,加上一个short类型和一个char类型,即4+4+2+1共11个字节。但是我们运行起来可以看到,这个struct B的大小为12个字节。至于为什么会产生这样的结果,我们首先要知道结构体的对齐规则。这里我们先创建一个结构体struct B b,第一个成员所在的位置偏移量就为0

2022-03-25 12:14:47 627 2

空空如也

空空如也

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

TA关注的人

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