自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 动静态库、软硬链接

动静态库1.概念2.打包动静态库①.打包静态库静态库使用②.打包动态库1.概念我们平时在写代码时总会包一批头文件,然后就可以使用库中的一些函数。linux下,如果在编译时不带任何选项默认使用的是动态库,如果带static选项使用的是静态库。编译一个简单的hello world程序#include <stdio.h> int main() { printf("hello world!\n");

2021-04-13 10:54:04 126

原创 基础I/O、系统级I/O

基础I/O1.系统级别I/O①基本概念②系统调用接口2.文件描述符什么是文件描述符①默认打开的文件②文件描述符分配规则3.重定向dup2系统调用1.系统级别I/O①基本概念在c语言中我们已经知道c有基本的打开文件,关闭文件的 fopen(), fclose() ,以及向文件写入内容的fwrite()和从文件读取内容的fread()等一些函数,但是函数都是语言层面上的,事实上它内部是调用的一些操作系统提供的接口,再加上c语言的缓冲区。那要真正了解文件的使用,学习系统级别的I/O是必须的。②系统调用接口

2021-04-08 18:28:58 225

原创 string实现

#pragma once#include <iostream>#include <string.h>#include <assert.h>using namespace std;namespace zjp{class string{public: typedef char* iterator;public: void swap(string& str) { std::swap(_str, str._s

2021-04-05 18:53:40 133

原创 进程替换、写一个简单的shell程序

进程替换进程替换进程替换概念替换函数替换函数的简单使用写一个shell程序进程替换进程替换概念进程替换意思就是,让一个进程替换另一个进程。Linux系统提供一系列接口来实现进程替换。需要注意的是,进程替换仅仅是当前进程在磁盘中的程序文件被另一个进程的程序替换,而内存中的pcb并没有替换,也就是说进程替换不创建新进程,而是让老进程执行新的代码。替换函数Linux提供了多个替换函数但是本质都是一样的,仅仅是使用方式不同。int execl(const char *path, const char *

2021-04-01 11:43:35 104

原创 Linux进程控制---进程创建、进程终止、进程等待、进程替换

进程控制1.进程创建1.父子进程代码共享2.父子进程数据独立2.进程终止1.终止方式2.return3._exit4.exit()3.进程等待4.进程替换1.进程创建给父进程创建一个子进程,父子进程代码数据独立代码共享。函数:fork() 返回值是 int1.父子进程代码共享fork()函数有两个返回值,调用函数创建进程的大体过程是这样的。父进程接收到返回值是子进程的pid,子进程接收到的返回值是0。int main() { pid_t id = fork();

2021-04-01 10:11:36 144

原创 C++模板

模板1.模板定义2.模板分类1.函数模板1.函数模板定义2.多个实参类型不同的情况3.函数模板原理--模板实例化2.类模板1.类模板定义1.模板定义模板是对类型进行参数化的工具。template <class T>template <typename T>template、class、typename均是c++中的关键字,上述两种定义方式作用相同。2.模板分类1.函数模板1.函数模板定义template <class T>

2021-03-22 18:36:39 60

原创 c++类和对象(初始化列表、explicit、static修饰成员、友元、内部类)

类和对象1.初始化列表1.来源2.概念3.为什么要有初始化列表2.explicit作用3.static关键字1.static修饰成员变量2.static修饰成员函数4.友元1.初始化列表1.来源c++类中的构造函数,可以在实例化对象时初始化对象的成员变量的值,实际上它的初始化过程是在对象定义出来后,再进行的赋值。就类似于这样int i; i = 1; 而初始化列表是这样的效果int i = 1;显然初始化列表才能真正意义上称之为初始化。2.概念以一个冒号开始,接着是一个以逗号分隔的数

2021-03-12 19:29:01 236 2

原创 C++内存管理(new、delete、operator new、operator delete、定位new)

C++内存管理1.new和delete使用①new单个和多个变量②delete2.new和delete底层原理---operator new。①operator new 和 malloc关系②operator delete 和 free关系3.定位new用法4.1.new和delete使用①new单个和多个变量②delete2.new和delete底层原理—operator new。①operator new 和 malloc关系②operator delete 和 free关系3.定位new

2021-03-12 19:21:34 129

原创 c语言整形提升和算术转换

整形提升和算术转换隐式类型转换(整形提升)算术转换赋值运算符类型转换正常表达式类型转换函数调用类型转换强制类型转换总结隐式类型转换(整形提升)char类型和short类型的变量在表达式中运算时会发生整形提升变成int类型。整形提升的方式:1.无符号数高位补0。2.有符号数高位补符号位。即:正数高位补0,负数高位补1。 char a; char b = 10; char c = 20; a = b + c; // 表达式中b和c先转换成int类型,再进行运算 //最后将运算结果截断

2021-02-10 16:43:34 208

原创 Linux基础开发工具——vim入门

vim 中有12种甚至更多模式,在不同模式下可以做不同的事,但入门的时候我们只用了解其三种模式即可进行最基本的代码编写了。vim入门正常模式(命令模式)1.移动光标页操作行操作2.删除文字3.复制4.替换5.撤销6.更改7.跳至指定行插入模式底行模式查找字符正常模式(命令模式)使用vim刚打开一个文件时就是正常模式,在别的模式下狂按ESC键也可以进入正常模式,在该模式下所有的输入都是指令。命令是区分大小写的。1.移动光标页操作1.k,j,h,l:vim中上下左右移动光标可以按键盘的上下左右键,更

2021-02-07 17:05:58 174

原创 C++构造函数、析构函数、拷贝构造函数、赋值运算符重载

类中四个常见的函数1.构造函数1.概念2.特性和使用析构函数1.概念2.特性1.构造函数我们在用类实例化处对象后总是要自己对它进行初始化,有时还会忘记初始化,这样会造成不必要的麻烦。构造函数可以实现在类实例化出对象后自动初始化成员变量。1.概念构造函数是一个特殊的成员函数,名字与类名相同,类实例化时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。2.特性和使用1.构造函数有形参,函数名必须和类名相同。2.构造函数没有返回值。3.构造函数只能在类当中

2021-02-05 19:04:08 350

原创 Linux进程(进程概念、特征、状态、优先级、进程地址空间、环境变量)

进程进程概念进程的特征程序和进程的差别进程控制块1.进程的组成2.Linux中进程相关指令进程的状态进程概念进程程序的一个执行实例,正在执行的程序。它是可执行程序关于数据集合的一次运行活动。内核观点:进程是分配系统资源(CPU时间,内存)的实体的运行过程。是系统资源分配、调度的基本单位。程序文件加载到内存就变成了进程。进程的特征1.动态性。进程是程序的一次执行,它有着创建、活动、暂停、终止等过程,具有一定的生命周期,是动态地产生、变化和消亡的。动态性是进程最基本的特征。2.并发性。指多个进程

2021-02-05 18:01:29 1257

原创 C++——类和对象

类和对象类1.类的引入2.类的定义3.类的访问限定符4.类的实例化(对象)5.类的大小(结构体内存对齐)6.隐含的this指针类1.类的引入c语言有结构体的概念,结构体中可以包含多个成员变量它封装了一个变量的各种属性。c++中也有结构体,与c语言不同的是它不仅包含成员变量还有成员函数。2.类的定义c++中的类可以用struct定义,多数情况下用class来定义。class student{ //成员 //成员变量 int _name; int _age; int _score;

2021-02-03 15:30:21 199 3

原创 c++内敛函数、auto关键字、范围for循环

内敛函数内敛函数1.为什么有内敛函数2.内敛函数使用3.内联函数特性、注意事项4.宏函数的优缺点auto关键字1.auto 的定义2.auto的使用3.auto使用注意事项4.auto使用细则范围for循环1.范围for循环的使用规范2.范围for循环的使用条件内敛函数1.为什么有内敛函数c语言库中的许多函数都是用宏函数来写的,主要原因调用函数会有参数压栈建立栈帧的消耗,宏函数是替换原来的函数,省去了建立栈帧的开销,提高了效率。但是宏函数很难阅读,不便维护。c++中为了解决这一问题引入了内敛函数的概

2021-02-02 18:14:57 163

原创 Linux——文件权限理解、切换用户

Linux下有两种用户:超级用户、普通用户。区别:超级用户:可以在Linux下做任何事情,不受系统限制。普通用户:只能做有限的事,受系统限制。切换用户:su [用户名]1.普通用户切换超级用户[zjp@VM-0-4-centos ~]$ su rootPassword: //普通用户切换到超级用户需要输入密码2.超级用户切换普通用户[root@VM-0-4-centos zjp]# su zjp //超级用户切换到普通用户不需要输入密码1.Li

2021-02-02 08:44:51 885 2

原创 C++——引用

引用1.引用的定义引用就是对另一个变量起别名,它仅仅是一个别名,编译器不会为它开辟内存空间,它和这个变量共用一个内存空间。int& b = a; 是定义引用。int& 是引用类型a,b共用一个内存空间,对一个的值改变另一个值也会改变。2.引用的特性1.定义一个引用必须要初始化(即要指明是哪个变量的引用)。2.一个变量可以有多个引用。3.一个引用只能对应一个实体,不能再引用其它实体。3.常引用当变量是const修饰后的常变量时,它的引用也必须要用const修饰后。

2021-02-01 19:04:27 163 1

原创 C++缺省参数和函数重载

缺省参数1.什么是缺省参数c++允许在函数声明或定义的时候给参数指定默认值,这样就可以做到在调用该函数时如果传参数,形参的值就是实参的值;如果不传参数那么形参的值就是指定的默认值。缺省参数分为全缺省和半缺省全缺省//所有形参都指定了一个值int Add(int x = 1, int y = 2, int z = 3){ return x + y + z;}int main(){ printf("%d\n", Add()); return 0;}半缺省int Add

2021-01-31 19:27:28 88

原创 C++入门,namespace关键字

用c++写一段"hello world"#include <iostream>using namespace std;int main(){ printf("hello world\n"); return 0;}namespace关键字C++有namespace关键字的原因namespace是对c语言的一个补充,在用C写大型项目需要多人合作的时候,很有可能会出现几个人定义的全局变量或函数出现命名冲突的情况,那这时就很难受了。而在C++的namespace这个关键字就很

2021-01-31 17:42:21 183

原创 快速排序递归实现

快排思路绝大多数树的排序算法,都可以先理解每趟排序然后再理解多趟排序,快速排序也不例外。下面我将介绍快速排序中单趟排序的三个方法及思路,分别是 左右指针法,挖坑法,前后指针法。1.左右指针法快速排序的每一趟都是为了找出值为key的元素的正确位置。而key是一个随机的元素值。left是从左往右走找比key大的,right是从右往左走找比key小的。然后交换两个元素的值。多次寻找后,最终left和right相遇将相遇位置的元素和key的交换,这样就找到key的正确位置,key的坐左边元素都小

2021-01-31 17:05:44 1277

原创 归并排序的递归和非递归实现,思想分析,时间复杂度分析

思路分析递归版代码实现及分析非递归版代码实现及分析

2021-01-27 18:30:46 868

原创 直接插入排序、插入排序

思路分析代码分析时间复杂度分析1.思路分析2.代码分析//直接插入排序void InsertSort(int *a, int n){ //将下标为i的元素插入到已经拍好序的序列中 for (int i = 1; i < n;i++) { //end记录已经排好序的并且未与temp比较元素的下标,初始值为 0 int end = i - 1; //temp记录本趟排序要插入的元素的值为a[end+1],此时end+1位置空余出来 int temp = a[en.

2021-01-25 10:20:11 144

原创 二叉树的构建、前、中、后序遍历、结点个数、叶子结点个数、第K层结点个数、

二叉树本篇博客主要是带来二叉树的相关操作的实现,内容很详细。二叉树建立求结点个数求叶子结点个数求第K层结点个数查找值为X的结点前、中、后序遍历1. 二叉树的建立// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树BTNode* BinaryTreeCreate(BTDataType* a, int* pi)//这里的a是树的所有结点元素的数组,pi是a的下标的地址//这里是解释[为何下标要传指针](https://blog.csdn.net/weixin_50

2021-01-21 17:41:15 225

原创 剖析二叉树使用数组创建传下标的地址

这里我使用反证法那如果在传值的时候我们传的是下标的地址,那我们每次改变下标的时候改变的就是同一个下标了

2021-01-21 17:35:09 117

原创 剖析memcpy和memmove区别

对于相同不同内存块memcpy和memmove都能实现内存拷贝,对于相同内存块memmove仍然可以实现内存拷贝,但是memcpy可能就实现不了了。主要原因就是memcpy只是进行从头到尾的拷贝而memmove可根据不同情况可能是从头到尾的拷贝也可能是从尾到头的拷贝不同内存块内存重叠(相同内存块)可以看到这样的重叠方式中字符串src = “ello”,dst = “hello”拷贝后dst = “ello”,也可以正常拷贝。如果是这样的重叠方式,memcpy因为是从头到尾的拷贝拷贝的过程也会

2021-01-11 19:22:22 187

原创 力扣225-用队列实现栈(C语言版)

要用队列实现栈,那我们首先应该明白的是实现栈的目的就是实现它的几个操作:压栈、弹栈、取栈顶元素、判空、求元素个数。那我们现在将每个操作细化来看应该如何实现。1、压栈:将元素尾插到栈中,队列的入队操也是将元素尾插队中。用队列的入队操作是可以实现的压栈的。2、取栈顶元素:取栈顶元素实际上就是取队尾的元素。可以用队列直接实现。3、判空:队列空了栈也就是空的。可以用队列直接实现。4、求元素个数:求队列中的元素个数即是栈的元素个数。可以用队列直接实现。5、弹栈:将栈顶元素删除就是删除队尾的元素。队列是先进.

2021-01-06 14:14:59 286

原创 力扣147-链表的插入排序

思路:1.创建一个新的链表2.对原链表进行头删3.在新链表找插入的合适位置(保证插入后链表有序)4.将头删的结点插入到新链表的合适位置处(头插操作和中间插尾插不相同)/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */typedef struct ListNode Node;struct ListNode* .

2020-12-31 15:59:46 153

原创 力扣142-返回链表的入环结点

这里我使用的是快慢指针思路:1.通过快慢指针判断该链表是否有环,若无环返回NULL如何判断链表是否有环可以看这篇博客快慢指针判断链表是否有环2.若有环,找到相遇位置3.让快指针从头开始向后走,慢指针从当前位置开始向后走,再次相遇时,相遇节点即是入环结点。下面给出代码/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; .

2020-12-28 11:30:50 92

原创 力扣141-给定一个链表,判断链表中是否有环。

我先给出代码/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */typedef struct ListNode Node;bool hasCycle(struct ListNode *head) { //快慢指针 Node *fast = head,*slow = head; while(fas.

2020-12-26 15:59:12 136 2

原创 出现一次的数字(找单身狗)

这里我们首先了解二进制数位异或的一些性质1.相同数字异或为0.(0 ^ 0 = 0, 1 ^ 1 = 0)2.相反数字异或为1.(1 ^ 0 = 1)3.和 0 异或结果不变( 1 ^ 0 = 1 , 0 ^ 0 = 0)4.和 1 异或结果相反( 1 ^ 1 = 0, 0 ^ 1 = 1)不妨将其推广到十进制数当中:1.相同的十进制数异或结果为 0例如:5 ^ 5 = 02.两个大小不同的数字异或之后结果一定不是0例如: 3 ^ 5 = 63....

2020-12-10 17:00:21 5243

原创 c语言常见字符串,strtok 函数的使用

c语言常见字符串函数使用及实现一、c的常见字符串函数:头文件 #include<string.h>1. 求串长:strlen(str) 求str长度(注意不包含‘\0’)2. 串比较:strcmp(str1,str2)两串相同返回0,相反返回1。3. 串复制:strcpy(str1, str2)将str2的内容复制给串1(包含’\0’)4. 串连接:strcat(str1, str2)将str2接到str1后面5. 找串中的字符:strstr( str, ch) ch是char类型

2020-11-19 17:26:10 437 1

空空如也

空空如也

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

TA关注的人

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