自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 抽象类的理解

4.定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。2.定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。1.定义一个函数为虚函数,不代表函数为不被实现的函数。3.定义一个函数为纯虚函数,才代表函数没有被实现。

2023-05-17 21:44:51 77

转载 FastDDS学习(1)

FastDDS是DDS(数据分发服务)规范的C++实现,DDS是由对象管理组(OMG)定义的协议。Fast DDS库提供应用程序编程接口(API)和通信协议,用于部署以数据为中心的发布-订阅(DCPS)模型,目的是在实时系统之间建立高效可靠的信息分发。Fast DDS在资源处理方面具有可预测性、可扩展性、灵活性和高效性。为了满足这些要求,它使用了类型化接口,并依赖于一个多对多的分布式网络范例,该范例巧妙地允许将通信的发布方和订阅方分离。Fast DDS包括:DDS API实现。

2023-05-09 16:42:07 469

原创 C++入门:STL_容器_vector的模拟实现

代码#include <iostream>using namespace std;namespace bit{ template <class _Ty> class vector { public: typedef _Ty* iterator; public: vector() :_First(nullptr), _Last(nullptr),_End(nullptr) {} ~vector() { delete _First;

2021-04-09 22:08:44 143

原创 C++入门:STL_容器_vector的使用

使用条件首先,如果你想使用STL_容器_vector,头文件应该写成这样:#include <iostream>#include <vector>using namespace std;向量初始化void main(){ vector<int> v0; vector<int> v1(10); for (int i = 0; i < v1.size(); ++i) cout << v1[i] << " "

2021-04-09 22:06:17 120

原创 linux基础IO

回顾标准库IO接口系统调用接口文件描述符动态库、静态库的生成与使用

2021-04-09 20:49:59 99

原创 C++入门:STL_容器_list的模拟实现

list本质是一个带有头结点的双向循环链表头结点的下一个节点是第一个节点,头结点是尾节点代码#include <iostream>using namespace std;namespace bite{ // List的节点类 template<class T> struct ListNode { ListNode(const T& val = T()) :_pPre(nullptr) , _pNext(nullptr) , _

2021-04-05 17:32:30 111

原创 C++入门:STL_容器_list的使用

使用条件首先,如果想要使用STL_容器_list,头文件应该写成这样:#include <iostream>#include <list>using namespace std;show函数void show(const list<int>& l){ auto it = l.begin(); while (it != l.end()) { cout << *it << " "; ++it; } cout &

2021-04-05 16:59:43 160

原创 linux小shell-程序详解加运行截图(详细)

minishell.c代码:#include<stdio.h> #include <unistd.h>#include <string.h>#include <stdlib.h>#include <ctype.h>#include <sys

2021-04-02 22:05:13 523

原创 linux进程控制(1)-进程退出、进程等待和程序替换

进程退出进程的推出有三种方法:①在main函数中的return。—推出前刷新缓冲区(在任意一个不是main函数的其它函数中的return不能让进程推出,它只会推出相应的函数)②库函数:exit()。—推出前刷新缓冲区③系统调用函数:_exit()。—直接释放资源,不会刷新缓冲区。进程推出场景分为:异常推出和正常退出,正常退出又可以分为能完成目标和不能完成目标。系统调用原因获取接口:perror(),strerror(errno)。进程等待...

2021-03-31 17:59:19 275

原创 linux进程概念(4)-程序地址空间

程序地址空间

2021-03-30 21:55:28 102

原创 Linux进程概念(3)-环境变量

环境变量基本概念环境变量(env)一般是指在操作系统中用来指定操作系统运行环境的一些参数。这些参数的内容可以让操作系统找到执行的程序,或者链接的库文件。常见环境变量PATH:保存了可执行程序的路径SHELL:保存了当前的命令行解释器的名称。HOME:保存当前用户的家目录。如何查看环境变量echo $[环境变量的名称]env:查看当前所有的环境变量环境变量的阻止形式:环境变量的形式是一个指针数组,里面的每一个数组元素都是一个环境变量。设置环境变量1.临时生效export[环境变量名

2021-03-30 17:24:27 221 1

原创 Linux进程概念(2)-进程的创建、僵尸进程和孤儿进程

文章目录进程的创建僵尸进程僵尸进程危害孤儿进程进程的创建说到进程的创建,那么不得不谈到一个重要的进程创建函数-fork()。fork系统调用是复制一个进程。当一个进程调用完它之后,就会产生一个一模一样的进程,由此我们就得到了一个新进程,我们把新产生的这个进程叫做子进程,原来的进程叫做父进程。fork这个单词是叉子的意思,可以看出它的命名和它的功能很相似。下面让我们通过一个小程序来了解fork的使用方法。编译,运行。从中我们可以看出,调用了fork()之后,出现了两个进程,并且它们的进程标示符不

2021-03-30 16:17:56 185 1

原创 Linux进程概念(1)-基本概念

进程我们在windows下面打开资源管理器,可以看到很多的进程。在linux下,进程又是什么呢?我们可以这样理解,电脑上面的所有软件都是由程序组成的,换言之,所有的软件都是程序,都是一行行的代码,是静态的。当我们把软件启动之后,就会衍生出许多许多的进程,而这许多许多的进程则是动态的。进程就是动态的程序。基本概念课本概念:程序的一个执行实例,正在执行的程序等。内核观点:担当分配系统资源(CPU时间、内存)的实体。描述进程进程包含很多信息,这些信息被放在一个叫做进程结构体的数据结构中。一般叫

2021-03-30 14:36:11 103 1

原创 C++入门:模版

文章目录为什么要有模版?什么是模版?函数模版类模版如何使用模版?函数模版的使用类模版的使用为什么要有模版?首先,我们先来看下面的交换函数。void Swap(int& a, int& b){ int tmp = a; a = b; b = tmp;}void Swap(double& a, double& b){ double tmp = a; a = b; b = tmp;}void Swap(char& a, char& b)

2021-03-28 13:33:04 75

原创 C++入门:内存管理

文章目录C语言内存管理(回顾)new和deletenew和delete对内置类型进行操作new和delete对自定义类型进行操作operator new与operator deletenew和delete是怎么实现的?定位newmalloc/free和new/delete的区别C语言内存管理(回顾)c语言进行动态内存管理基本上使用四个函数:malloc、calloc、realloc、free。malloc:语法格式-void * malloc(size_t size) ,其中size是开辟的空间的字节

2021-03-23 11:58:34 160

原创 C++入门:友元、static静态成员、内部类

友元、static静态成员变量、内部类

2021-03-22 11:29:34 242

原创 C++入门:析构函数、赋值重载函数、取地址函数和const取地址函数

文章目录析构函数赋值重载函数取地址函数和const对象取地址函数一、上一篇我们知道了类里面有六个默认成员函数,并且介绍了构造函数和拷贝构造函数,今天我们来了解一下剩余的四个函数:析构函数、赋值重载函数、取地址函数和const对象取地址函数。析构函数我们知道了构造函数是对一个对象进行初始化构造,那么,如果要销毁这个类,也就是要把类占用的资源释放,我们就用到了析构函数。~类名(){实现方法;}//函数格式一般来说,析构函数一般是用来释放对象构造的时候在堆上申请的空间。就像下面的代码:class S

2021-03-21 21:35:40 277

原创 C++入门:构造函数和拷贝构造函数

文章目录构造函数拷贝构造函数一、类的6个默认成员函数如果一个类中什么成员都没有,简称空类。空类中什么成员都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数:构造函数、析构函数、拷贝构造函数、赋值重载函数、普通对象取地址和const对象取地址。那么,这6个函数有什么用呢?既然会默认生成,那么我们还需要自己实现吗?还有许多问题,接下来我们一一解答,今天,首先来看构造函数和拷贝构造函数。构造函数clss Date{public: void SetDate(int y

2021-03-15 17:15:08 576

原创 C++入门:类与对象

1、什么是类?什么是对象?众所周知,C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。在C语言中,结构体中只能定义变量,而在C++中,结构体不仅可以定义变量,也可以定义函数。C语言中用struct定义结构体,C++当中更喜欢用class来代替。2、类的定义class className{ //类体:由成员函数和成员变量组成};//一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主题,注意类定义结束时后面分

2021-03-08 17:38:16 121 1

原创 C++入门:函数重载

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 参数类型 或参数顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。注意:不能仅仅依靠返回值的不同认为是重载函数。1、函数重载的概念明显可以看出上面的三个Func函数的参数列表不同,这三个函数就是重载函数。2、为什么C语言不能实现重载函数,但是C++可以。因为C语言在编译的时候将函数名重写成_Func了,但是C++在编译的时候将函数名重写成了很多形式。这就导致了C

2021-03-07 22:17:41 138

原创 Linux调试器-gdb

一、有关于gdb需要注意的几个点1、如果要在Linux下进行程序的调试,那么需要在编译程序的时候将程序编译成debug版本。debug版本:是程序员用来调试的一个版本,里面包含了调试程序所需要的各种调试信息。release版本:是程序的发行版本,一般用户拿到的就是这个版本。它比较于debug版本做了优化。Linux下默认生成的就是release版本,如果想要生成debug版本,需要在编译的时候加上命令行参数 “ -g ”。然后用生成的debug版本进行调试。2、调试的步骤2.1调试可执行程序

2021-03-06 11:46:27 151

原创 多种排序总结

//这里先写一个交换函数,避免后续重复书写。void Swap(int *a, int *b){ int tmp = *a; *a = *b; *b = tmp;}// 插入排序void InsertSort(int* a, int n){ int left = 0; int right = n; for (int i = left+1; i < right; i++) { int j = i; while (j>left&&a[j] <

2021-02-07 12:05:57 107

原创 二叉树的实现

一、Sysutil.h//系统头文件#ifndef _SYSUTIL_H_#define _SYSUTIL_H_#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>#include<stdbool.h>#pragma warning (disable:4996)#include<vld.h> //内存泄漏工具的头文件#in

2021-02-03 17:37:25 205 3

原创 单链表实现队列_顺序表实现队列

一、Sysutil.h//系统头文件#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>#include<stdbool.h>#include<windows.h>#include<vld.h> //内存泄漏工具的头文件二、单链表实现队列函数#include"Sysutil.h"#define QueueEle

2021-01-26 19:08:26 154 1

原创 顺序表实现栈_单链表实现栈

一、Sysutil.h//系统头文件#ifndef _SYSUTIL_H_#define _SYSUTIL_H_#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>#include<stdbool.h>#include<windows.h>#include<vld.h> //内存泄漏工具的头文件#endif

2021-01-26 19:01:49 121

原创 双向循环链表的实现

一、Sysutil.h//系统头文件#ifndef _SYSUTIL_H_#define _SYSUTIL_H_#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>#include<stdbool.h>#pragma warning(disable:4996)#include<vld.h> //内存泄漏工具的头文件#en

2021-01-24 22:03:59 103

原创 单链表的实现

一、Sysutil.h//系统头文件#ifndef _SYSUTIL_H_#define _SYSUTIL_H_#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>#include<stdbool.h>#include<windows.h>#pragma warning (disable:4996)#include<v

2021-01-24 22:01:00 76

原创 顺序表的实现

一、Sysuti.h//系统头文件#ifndef _SYSUTIL_H_#define _SYSUTIL_H_#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>#include<stdbool.h>#include<vld.h>#pragma warning (disable:4996)#endif二、Seqlist

2021-01-24 21:56:57 85

原创 static关键字

关键字:static在c语言中,static关键字是用来修饰变量和函数的1.修饰局部变量-静态局部变量结论:static修饰局部变量改变了变量的生命周期,延长了静态局部变量的生命周期,但是作用域不变。2.修饰全局变量-静态全局变量结论:一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件使用。3.修饰函数-静态函数结论:一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。...

2021-01-07 21:44:15 71

原创 几个大小端的判断的程序

一、利用联合体来判断#include<stdio.h> int main(){ union Un{ int i; char c; }; union Un un; un.i=0x11223344; un.c=0x55; printf("%x\n",un.i); return 0; }我们知道联合的成员是共用同一块内存空间的。我们看联合体内的第一个变量i,它是int类型,是32位,4个字节;而第二个变量则是char类型,是8位,1个字

2021-01-05 17:37:19 880 1

原创 整形提升

一、为什么要整形提升?因为C语言的整形运算总是至少以却省整形类型的精度来进行的。二、如何进行整形提升?整形提升是按照变量的数据类型的符号位来提升的。●如果是无符号数,直接补零;如果是有符号数,则补符号位。●识别类型时,看的是自身类型。1、负数//负数的整形提升char c1=-1;变量c1的二进制形式(补码)中有8个比特位:1111 1111因为c1是有符号数,所以在整形提升的时候,需要补符号位,也就是补24个1。1111 1111 1111 1111 1111 1111 1111

2021-01-03 22:09:02 112

原创 程序环境和预处理

一、程序环境我们知道计算机是没有办法认识除了二进制之外的语言的,所以我们现在编出来的代码要想让计算机认识并实现,就必须把它转换成二进制语言。我们把这个过程叫做程序的翻译过程。程序的翻译过程又分为四个阶段:1、预处理:在这个阶段,它做了四个工作:宏替换、去注释、头文件展开和条件编译。2、编译:在这个阶段,它只做了一件事情,那就是将c语言编译成为汇编语言。3、汇编:在这个阶段,它也只是做了一件事情,把汇编语言变为目标二进制。4、链接:最后一步,将目标二进制文件和库函数链接形成可执行程序。那

2020-12-25 12:34:13 343

原创 C语言文件操作大总结

1、我们为什么要使用文件?之前,我们的C语言都是在内存上对数据进行处理,但是我们知道内存有一个属性-掉电易失性。那么,我们不可能在每次电脑重新启动之后,把数据都重新输入一遍,那可太麻烦了。所以,文件就出现了,什么是文件呢?这里我们先简单地认为,磁盘上的文件是文件,而它具有使数据持久化的功能。我们就是为了使数据持久化才使用的磁盘。2、文件=文件属性+文件内容3、文件类型:文件类型有两种,一种是文本文件;一种是二进制文件。二进制文件就是,数据在内存当中是什么样子的,到了显示器上还是什么样子。文本文件

2020-12-19 17:28:13 148 1

原创 通讯录(可变长版本)

基于上一个通讯录,改写了一个可以动态存储的版本,在原始存储人数的基础上,每次只要超出了存储范围,就在堆上开辟新的空间。1、contact.h#ifndef _CONTACT_H_#define __CONTACT_H_#include<stdio.h>#include<windows.h>#include<stdlib.h>#include<assert.h>#include<string.h>#include<mallo

2020-12-19 11:35:06 574 1

原创 通俗易懂的通讯录C语言

这里写目录标题通讯录功能contact.hmain.ccontact.c通讯录功能1.添加联系人2.删除联系人3.查找联系人(可以通过姓名查找,也可以通过电话查找)4.修改联系人(通过姓名查找)5.显示所有联系人6.清空所有联系人7.排序所有联系人contact.h#ifndef _CONTACT_H_#define __CONTACT_H_#include<stdio.h>#include<windows.h>#include<stdlib.h&

2020-12-13 21:50:46 158

原创 深入理解动态内存管理

1、为什么存在动态内存分配?我们之前为数据开辟的空间都是在栈上开辟的,但是,在栈上开辟空间有几个缺点。第一个缺点:开辟空间小,没办法使用大空间,当开辟大空间之后,系统会发生错误。第二个缺点:开辟空间是固定的,然而有的时候我们需要的空间在程序运行的时候才能知道。基于以上两个缺点,就出现了动态内存开辟的解决方法。2、动态内存函数的介绍(1)malloc和freea、malloc动态内存开辟函数:void * malloc(size_t size);这个函数向内存申请一块连续可用的空间,并返

2020-12-08 19:42:26 196

原创 深刻理解结构体的内存对齐问题

1、为什么要对结构体内存对齐?了解计算机的人都知道,CPU是没有办法来存储数据的,CPU只有计算能力。所以,存储数据的任务就交给了内存。那么,当CPU需要计算的时候,就需要从内存上获取数据,内存上数据和地址是对应的,CPU只要知道对应数据的地址,就可以调用数据了。知道了CPU必须寻址之后,我们来看一下一个结构体是怎么定义的。struct s1{ char c1; int i; char c2;}我们来通过一个图看一下,没有进行内存对齐的时候,CPU是怎么进行寻址的。前提:硬

2020-12-06 13:42:33 261

原创 memcpy和memmove的相同和不同

一、相同(1)它们都是以字节为最小单元来进行操作。(2)它们都可以在一定情况下将源字符串复制到目标字符串。二、不同memmove可以处理的源内存块和目标内存块是可以有重叠的。三、不同点的解释我们可以把源内存块和目标内存块的地址分为以下几种情况,内存地址的大小从左到右就是从低地址到高地址。情况1:情况2:情况3:情况4:情况1和情况2不属于源字符串和目标字符串重叠的情况,我们不予讨论。我们要解释的就是情况3和情况4,它们就属于内存重叠的情况,memmove可以保证输出正确,而me

2020-12-05 19:13:31 253

原创 字符串常用函数大全

众所周知,C语言里面有很多额字符串函数。那么,如何高效合理地运用好这些函数是一个难点,下面我就来给大家说说我是如何理解这些字符串函数的。 在介绍字符串函数之前,我们先来给这些个字符串函数分一下类。...

2020-12-04 20:43:18 18414 2

原创 C语言指针笔试题

1、我们先来看第一段代码和它的输出。int main(){int a[5] = { 1, 2, 3, 4, 5 };int *ptr = (int *)(&a + 1);printf( "%d,%d", *(a + 1), *(ptr - 1));return 0;}分析:首先,先看 * (a+1),这是对a的首地址向后移动一个单位,也就是第二个地址,然后再解引用,也就是数组第二个元素,就是2。然后我们再看第二个输出,int * ptr = (int * )(&a

2020-12-04 12:25:01 628

空空如也

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

TA关注的人

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