自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux | 进程间通信:共享内存

所有进程都可以访问共享内存中的内容,如果某个进程向共享内存写入了数据或对其内容进行修改,那么所做的改动将立刻被访问同一共享内存的其它进程看到。由于main.c中向共享内存写入一个值,test.c就会不断重复打印该值,未达到想要的效果。由于共享内存未提供同步机制,所以我们通常需要用其他的机制来同步对共享内存的访问(共享内存为多个进程之间共享和传递数据提供了一种有效的方式。, 可以给 SHM_RDONLY 为只读模式,其他的为读写。(2)shmat():对申请来的共享内存进行映射。只能写入一次读取一次。

2023-01-07 23:07:17 121 2

原创 算法入门 | 二叉树的递归遍历、递归创建系列(递归)

主要依据:二叉树的物理存储对应逻辑存储的关系。确保每次递归时传参是对同一字符串。二叉树物理下标为i:其。

2022-11-23 21:56:20 671 1

原创 算法入门 | 分治策略

目录分治策略1.分治法可以解决的问题特征2.分治法解题步骤3.分治法编程举例递归求阶乘求斐波那契数列小练习:给出一个数n,打印其每一位(1)问题规模缩小到一定程度就可以轻易解决(2)问题可以分解为若干个规模较小的相同类型问题(3)使用小规模的解可以合并成该问题原规模的解(4)该问题分解出的各个子问题相互独立(1)分解:将原问题划分为与原问题形式相同的子问题,只是规模减小。(2)解决:递归求解子问题,如果子问题规模足够小则停止递归,直接求解。(3)合并:将小规模的解合并为原规模问题的解。(1)思想:不断缩小问

2022-11-07 21:00:32 543

原创 C++ | 简单线程池的实现

每个线程创建(start)后会先调用设置的回调函数threadInitCallback(事务),接着去事务队列取事务并执行。,function也可以认为是一个函数类型或函数对象(包装了void()类型的函数)。将标志状态running设置为false且唤醒所有阻塞在等待队列的条件变量empty令其返回空事务结束执行)封装,存放的为事务(其实为void(void)类型函数);此处传递join()为线程成员函数,故需要绑定。),接下来从事务队列取事务并执行。要添加进事务队列的事务即可。

2022-11-01 10:24:48 672

原创 字符串匹配算法之BF算法、KMP算法

BF算法即暴力算法。它的思想就是将模式串和主串的字符进行一一比较:模式串和子串进行比较,一致时继续比较主串和模式串该趟的下一个字符,直到比较完整的整个模式串;不一致时模式串后移一位,以主串的下一个字符为起始,模式串从首位重新开始比较。重复上面的步骤。(如下图)

2022-10-05 11:02:27 704

原创 【浅谈状态机】枚举+switch实现C语言状态机、抽象类 公有继承实现C++状态机

不能盲目++,因为如果字符串以符号结尾,则最后一个单词不会误判,不需要num++。注意:最后一个单词在循环中无法判断(不会由单词里->单词外),greet函数会调用相应子类的reponse函数。【单词里->单词外~代表有一个单词,num++】,再只需要将kiss函数中delete p;当然C++的状态机是易于扩展的。我们可以在Creature类中再写。【抽象类 公有继承】

2022-10-02 18:25:54 1348

原创 计算机组成原理(白中英) 第一章课后题部分答案(知识点汇总及扩展)

冯·诺依曼型计算机的主要设计思想是存储程序和程序控制。存储程序是指将指令以二进制代码的形式事先输入计算机的主存储器(按其在存储器中的首地址执行程序的第一条指令);程序控制是指控制器顺序执行存储的程序。冯·诺依曼型计算机主要组成成分包括:运算器(以运算器为中心)、存储器、控制器、输入设备、输出设备。

2022-09-26 23:35:09 1965

原创 单链表笔试题(是否相交,求交点;是否有环,求入环点)C++

单链表笔试题(是否相交,求交点;是否有环,求入环点)C++1. 判断两个单链表是否相交,若相交求交点。2. 判断单链表是否有环,若存在环 则返回入环点。

2022-09-05 11:28:51 263

原创 C++笔试题详解+扩展

C++笔试题详解+知识扩展

2022-08-02 22:50:50 316 1

原创 C++ 类的继承访问控制问题

若继续派生,私有成员在派生类中也无法访问。下列程序编译时会出现错误,请根据行号选择。私有成员在子类中依然存在,但均不可访问。类的实例(创建类的对象)无法访问。派生类中可以通过成员函数访问。只能被内部或继承类内部访问。保护protected。,在派生类的类外部)...

2022-07-19 12:02:03 318

原创 Linux | 进程间通信:信号量

信号量sem为一个特殊变量(通常取正值),代表可用资源数目,由内核直接管理。信号量是用来控制同步进程的。【信号量的pv操作】:信号量减一代表获取资源可能阻塞(信号量为0时)(p操作)信号量加一代表释放资源(v操作)同步进程(对程序的执行进行控制)。信号量只取0和1:二值信号量;信号量的取值>1:计数信号量(资源信号量)。

2022-06-11 17:53:15 896

原创 Linux | 进程间通信:管道

当写端关闭时,读端解除阻塞直接返回(返回值为0)。当读端关闭时,写端无法再向管道写入数据,会触发异常(系统会发送信号13 SIGPIPE中止程序)。因此读端关闭时写端坚决无法向管道再写入数据。向管道写入的数据在内存中,从管道读数据是从内存中读!管道的通讯方式为半双工!有名管道和无名管道的区别:有名管道可以在任意两个进程间通信!!无名管道只能在父子进程间通信!!管道写满(指内核为管道开辟的空间写满)时写操作会阻塞;管道为空时读操作会阻塞。

2022-06-05 21:48:54 185 1

原创 Linux | 信号的发送及响应

收到17信号代表子进程结束,子进程先结束会变为僵死进程,正好可以在这时处理僵死进程:调用wait()处理僵死进程+获取退出码,调用WEXITSTATUS()打印退出码。,发送信号2会将结构体中变量signal的第二位(由低位开始数)由0置为1(因此信号值不会超过长整型的位数32)。),键盘按下ctrl+c(结束进程),会产该信号。默认(SIG_DFL)、忽略(SIG_IGN)、自定义(自己写的信号处理函数)kill+进程号杀死进程,默认发送的是信号15!参数1为信号代号,参数2为函数指针(指针指向。

2022-06-03 22:24:49 540

原创 Linux | 实现mybash、mybash优化、Linux调试

man inode:判断文件类型file type,参数m为struct stat{}中的成员st_mode。第一次调用:第一个参数为待分割的字符数组,第二个参数为分隔符(字符串常量)。:内置命令只能对当前进程操作,不能通过命令解释器fork+exec产生子进程实现。第二次调用:同一个函数中会记录上一次分割的位置,从其后开始分割。得到文件属性信息(第一个参数为文件名,第二个参数为。参数为目录名,返回值为指向该目录流的指针。字符串的比较应使用字符串比较函数。,参数为目录流指针DIR*。

2022-05-28 19:21:16 175

原创 Linux | 进程替换 进程地址空间

进程替换若替换成功则原进程空间释放,将其替换为新的进程,且原进程的PCB中只有name(进程名)发生改变,pid、ppid不发生改变。替换进程使用exec系列方法:execl execlp execle execv execvp 均为库函数,最终均调用execve(系统调用)。

2022-05-22 17:25:31 147

原创 Linux | 文件操作的系统调用 文件表

C语言中对文件的操作对于文件的管理:由操作系统~文件系统进行。文件操作的系统调用 open read write close (系统调用:实现在内核中【用户态->内核态】—“陷入内核”)C语言操作文件的库函数 fopen fread fwrite fclose (C语言fopen库函数的执行底层是调用Linux系统调用open();printf()库函数底层是调用write()系统调用实现的)

2022-05-16 09:11:45 266

原创 Linux | fork()、僵死进程、写时拷贝

Linux基础之fork()产生子进程以及僵死进程、孤儿进程的介绍。

2022-05-15 16:21:01 611

原创 C++ 1.2 this指针 构造函数

一、this 指针(节省空间,时间换空间)对象可以根据属性来区分,为了降低空间复杂度,可以让同类型对象共享一份成员函数。1.编译器针对设计的类型分三步编译:(1)识别和记录类中的属性(名称、类型、访问限定)(2)识别和记录类中函数的声明例如:对于以下代码,调用函数funa()时其内部调用func(),func()在funa()后面定义,故显示无法识别func(),除非先声明 void func(); 才可。#include<iostream>using namespa

2022-05-11 18:24:47 722

原创 C++ 1.1 基础知识 类

一、基础知识1.面向对象:封装、继承、多态2.类(像一个图纸,不分配空间),类实例化后产生对象(实体)。类是对象的属性与方法的集合。3.类实例化产生对象,类中的成员变量(可以为变量、指针、数组)是对象的属性(对象的属性值决定对象的状态),类中的成员函数是对象的方法(确定对象的行为)。4.对象的关系有:包含、继承、关联。二、类的设计、对象的创建与使用1.类型设计格式:class 类型名称 {}; 或 struct 类型名称{};类是把属性和函数(对象的操作)封装为了一个整体。

2022-05-10 21:40:11 247 2

原创 Linux | 基础知识+fork()

打印:将数据交给内核(操作系统),再由操作系统打印出来。由于我们会不断的进行用户态->内核态的切换,为了减少开销提升效率,因此有了缓冲区的存在。eg:main.c在磁盘(硬盘)中存放、编译后的可执行程序main也在磁盘中。(实际为一个结构体struct,其中pid进程号唯一标识一个进程)来管理进程(进程三状态:就绪、运行、阻塞)。2. 为Linux专有的头文件,包含一些可用的函数(如sleep())。,每次在分配(运行程序)的时候是操作系统看内存哪里有位置就分配。进程:正在执行的程序。

2022-05-08 21:41:41 653 1

原创 Linux 基础知识入门简述

系统内核及启动。

2022-05-08 19:05:04 524 1

原创 如何写代码判断该系统为小端存储/大端存储?

小端存储:低位数存于低地址,高位数存于高地址。1.指针#include<stdio.h>int main(){ short a = 0x0001; char* cp = (char*)&a; if (*cp == 1) { printf("小端存储\n"); } else if (*cp == 0) { printf("大端存储\n"); } return 0;}如图:2.联合体(共用体)#include<stdio.h&

2022-05-08 16:51:41 309

原创 C语言-结构体 字节对齐

由于结构体存在字节对齐,所以结构体所占字节大小不是其各成员所占字节数之和!!例1:下面程序结果为12,不是6!#include<stdio.h>struct Node{ char cha; int ia; char chb;};int main(){ struct Node sd; printf("%d\n", sizeof(sd));//12 return 0;}该结构体变量在内存中的表示形式:假设以0地址作为首地址。cha占一个字节,但由于ia相对.

2022-05-08 16:13:03 3605 1

原创 位运算专题二:左移、右移、异或

1. 左移<<:将整型数转为二进制补码形式表达后在其末尾添0,再截取需要的低位即可。分析如下代码(有符号数在左移时会在正负间徘徊):#include<stdio.h>int main() { printf("对于无符号数:\n"); unsigned char a = 0xaa; //无符号整型数a=1010 1010 for (int i = 0; i < 8; i++) { printf("%d\n", a); a = a << 1;.

2022-03-25 15:21:38 1399

原创 位运算专题一:位与、位或、位反

位运算只用于所有的整型!!(char,short,int,long int,long long,unsigned char,unsigned short......),浮点值均不适用!!!位运算有哪些呢?& 位与,| 位或,~ 位反,^ 异或,<< 左移,>> 右移,接下来介绍前三个,剩余的在下一篇介绍!1. & 位与先来回忆逻辑与:&&两边操作数非零即为真!再进行与运算。(C语言中0='\0'=NULL=false)而位与则是:将操作

2022-03-24 11:47:30 4351

原创 C语言数据类型专题之整型数值的转换:切片(截取)

整型的不同类型数值之间的转换二:切片(将表示范围大的整型变量赋值给表示范围小的整型变量)1. 切片指:从低地址到高地址截取相应的位!(由于数据在内存中是小端存储),仍然是补码运算!!例如:int x; short a=x; //将int类型的4字节32位的变量赋值给short短整型2字节16位的变量若x表示为:(高地址)0001 0010 0011 0100 0101 0110 1010 1000(低地址),则a为x截取(切片)低16位:0101 0110 1010 10002. 分析下列代

2022-03-20 22:40:14 2562

原创 C语言数据类型专题之整型数值的转换:扩充

整型不同类型数值的转换一:扩充(将表示范围小的整型变量赋值给表示范围大的整型变量)方法:若该数本身为有符号数,在其二进制数补码形式最前面扩充符号位;无符号扩充0。补码的形式参与运算!!!如:char a=5; short x=(short)a; //char类型为有符号、1字节(8 bit),赋值给short短整型2字节(16bit),要进行扩充。a=5=0000 0101,因为有符号数扩充符号位故将a扩充为:0000 0000 0000 0101,由于a为正数,因此该临时值即为最终结果。再如:

2022-03-20 20:59:16 2035

原创 修炼基础之C语言数据类型专题一

1.数据在内存中存储形式:小端存储,高位数存放在高地址,低位数存放在低地址(以16进制的形式)。如:int ia=0x12345678;// ia在内存中如下图形式存储。2.计算机存储整型数据是以补码的形式存储!(正数原码、反码、补码相同;负数补码=原码除符号位,取反加一)。CPU只能进行加法运算(5-5=5+(-5))char ch=5; //char为1字节(8个二进制位)5的补码与原码相同:0000 0101char ch=-5; //-5:1000 0101(原码)、1111 101

2022-03-19 12:13:21 396

原创 C语言二维数组下三角、上三角螺旋赋值并打印

题目:将一个7*7(只能要求必须行和列相等的矩阵)的二维数组下三角部分以螺旋、依次+1的方式填满并输出(如下图所示)方法:依旧设置四个变量Left、Right、Up、Down控制循环,不过只有三种模式,故只需要三个for循环(红色线条、蓝色线条、绿色线条)即可解决。代码如下:(需要注意的已在代码中用注释说明)#include<stdio.h>void Print_Ar(int br[7][7],int n) { for (int i = 0; i < n; i++)

2022-03-19 10:31:34 3397

原创 C语言二维数组螺旋打印一组数

题目:给出一个5*5的二维数组一组数,要求螺旋打印(如下图所示)方法:设置四个标志位控制四个打印方向(如图),分四个for循环打印当Left<=Right&&Up<=Down,说明还有数据。代码如下:#include<stdio.h>int main() { const int n = 5; const int m = 5; int ar[n][m] = { {1, 3, 5, 7, 9 }, {10,12,14,16,18},

2022-03-13 11:04:41 1216

原创 在给定的二维数组元素中查找对应值位置的两种方法

一、二维数组快速查找对应值题目:给出已知的二维数组(5*5)的所有元素值,要求编写函数求需要查询的值在该二维数组哪一行哪一列。1.常规查询+技巧返回并确定其所在位置#include<stdio.h>int FindValue(int br[5][5], int row, int col, int val) { int i, j; for (i = 0; i < row; i++) { if (val <= br[i][col - 1]) { break;

2022-03-13 10:10:13 3338

原创 二维数组系列

一个二维数组本质上讲是由多个一维数组构成(二维数组的元素是一维数组)。每个一维数组的大小必须相同!(行优先存储!) 扩展三维数组:int ar[2][3][4]:2层 3行 4列二维数组的定义:类型名 数组名[行表达式][列表达式] 行与列必须用常量表达式。1. 进一步了解二维数组与指针 请看下面的代码段:注释带大家学习????#include<stdio.h>int main() { int ar[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

2022-03-12 21:20:34 340

原创 二级指针入门(一定有收获系列)

1. 二级指针存放一级指针的地址,一级指针存放变量的地址,变量存放数值。(只要是指针,均占4个字节!) int a = 10; int* p = NULL; int** s = NULL; s = &p; //s为二级指针,指向一级指针p的地址 *s = &a; //s=&p; *s=*&p=p=&a; p为一级指针,指向变量a的地址 **s = 100; //**s=*p=*&a=a=100; 变量赋值为1002. 如图,问 s+1是加

2022-01-24 09:08:14 660

原创 牛客小测验(C语言/C++)总结 第二弹(值得一看

牛客C语言、C++小测验总结!(全是干货!

2022-01-22 12:02:42 453

原创 牛客小测验(C语言/C++) 总结

1. 设有定义char *p[]={"Shanghai","Beijing","Honkong"};则结果为j字符的表达式为()A *p[1] +3 //p[1]即*(p+1)指向字符数组第二个字符串"Beijing"首元素地址,解引用即B,再加三即'B'的ASCII码值加三:66+3=69B *(p[1] +3) //同理,p[1]指向字符数组第二个字符串"Beijing"首元素地址,再加三即指向字符j的地址,解引用后值为jC *(p[3] +1) //p[3]越界(数组下标从0开始!)D

2022-01-22 09:31:39 997

原创 无类型指针专题(看了一定有收获系列)

一、简要介绍1. 无类型指针有一个很重要的特点:可存放一切数据类型的地址(来者不拒,可存放任何地址!)#include<stdio.h>int main(){ int a=10; char ch='a'; double dx=12.23; int* p=&a; char str[10]={"hello"}; void* vp=NULL; //vp可存放任何地址! vp=&a; vp=&ch; vp=&dx; vp=&p;

2022-01-20 22:14:06 1274 2

原创 字符串与数组练习专题(欢迎大家阅读)

一、请大家看一个有趣的题目(问输出结果是什么?)//上代码#include<stdio.h>int main(){ const char* str[]={"hello","xiaoxin","printf","scanf","xiaobai"}; const char* s=str[1]; int n=sizeof(str)/sizeof(str[0]); for(int i=0;i<n;i++){ printf("%s \n",s); s=s+1; } re

2022-01-01 14:51:53 483 1

原创 C语言字符串专题二:重写字符串相关函数+朴素字符串匹配算法

欢迎大家阅读!

2021-12-29 11:13:18 439

原创 C语言字符串专题一:重写字符串拷贝函数、字符串连接函数以及求字符串长度函数

C语言字符串小插曲,欢迎大家阅读!

2021-12-28 22:18:37 518

原创 demo18:一维数组、二维数组打印杨辉三角

9.分别用一维数组、二维数组两种不同的方法打印杨辉三角(前20行)1)一维数组(使用滚动数组,从后往前更新值,边更新边输出!)代码如下://1.一维数组实现#include<stdio.h>#define N 20int main(){ int arr[N]={1}; int i=0,j=0,k=0; for(i=0;i<N;i++){ for(k=N;k>i;k--){ printf(" "); } for(j=i;j>=0;j

2021-11-04 01:06:02 782

空空如也

空空如也

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

TA关注的人

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