- 博客(48)
- 收藏
- 关注
原创 C++模板浅谈
一,模板介绍由来:在C语言中,每次使用数据结构的时候都得自己写一个,而且还不支持多个类型的使用,必须重新换一个类型适应要求。所以C++就提出模板的概念,它要能支持多种类型的使用,而不是只能用一种类型,并且给你放在库里,你可以直接使用。二,函数模板1,为什么不用重载替代模板?重载虽然可以实现多种类型的使用,但是重载复用性太低,每次有新的类型都需要重新加入。代码维护性低,一个代...
2018-11-17 11:02:48
402
转载 gdb调试多进程和多线程命令(结合例子)
1. 默认设置下,在调试多进程程序时GDB只会调试主进程。但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序。只需要设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)即可。 follow-fork-mode detach-on-fork 说明parent ...
2018-11-16 21:25:36
386
原创 信号的产生,处理,终止
一,信号的产生信号的产生有三种方式: 硬件产生:CTRL + C,CPU,MMU报错等,发出的信号 软件产生:进程读写文件时发生错误,如另一个进程关掉了文件描述符,alarm信号等 ...
2018-11-16 19:15:58
1415
原创 C++内存管理及new /malloc,free/delete 区别
前言:在C++中首先要了解的是它的内存分布,在操作系统中,它叫程序地址空间(虚拟地址空间)。这里的地址空间并不是真正的物理地址空间,而是虚拟的,原因很简单:第一点:操作系统为了保护资源,不能给你真正的地址,防止你破坏。第二点:高效性,给你4G的内存(32位下),并不一定全给你分配,只是给你映射需要的一部分。这样多个程序跑起来的就会非常快。下面,具体说下分布: ...
2018-11-09 16:08:14
205
原创 通过信号量PV操作实现,同步互斥机制
如果你不了解信号和PV操作,可以看我上篇博客,这篇主要是实现同步互斥。场景:当一个进程和另一个进程在同时使用一个临界资源时,会变得错乱,所以我们需要通过信号量的PV操作,来加同步互斥。前言:1操作系统是通过数组来管理信号量的数量的。 2,P操作,是对信号量进行减减,V操作是对信号进行加加,(当信号量小于0时,会等待,这就是同步)。 3.当信号量...
2018-11-08 14:16:57
1711
转载 信号与PV操作
本文是转载,因作者没有在csdn上写,所以转载过来了,本人特别喜欢这篇文章在计算机操作系统中,PV操作是进程管理中的难点。首先应弄清PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下: P(S):①将信号量S的值减1,即S=S-1; ②如果S³0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。...
2018-11-08 11:53:11
1201
原创 单例模式之饿汉,懒汉
一,单例模式单例模式是设计模式中的一种,本文主要介绍单例模式。单例模式核心:一个类只能创建一个对象,保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。事例:在某个服务器中,该服务器的配置信息放在一个文件,这些数据必须由一个单例对象读取,其他对象通过这个单例对象过去配置,这样设计的话,节约了大量时间。单例之饿汉模式: 直接上代码:#i...
2018-11-07 17:51:23
152
原创 静态库,动态库(实现自己的加,减库)
一,静态库程序在编译链接期间的时候把库的代码链接到可执行文件中,程序运行的时候将不再需要静态库二,动态库程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码重点:一个动态链接的可执行程序文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标的整个机器码 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的动态库中复制到内存中,这...
2018-11-06 17:05:23
268
原创 理解文件系统(inode的掌握,软链接,硬链接)
一,在Linux中,一切皆文件,所有的东西都可以被看做文件。所以文件信息要被管理起来,要让操作系统能够很好的运用它,那么它是如何被管理起来的?1.被描述:自身属性和其他重要信息被描述为inode,操作系统为他们inode分配一个inode号,去标识它们。(这并不难理解,这和进程的pid是一样的道理)2,组织:操作系统要想把它们放在磁盘里,并让它们能够有序的判断哪些inode被用,哪些没被用...
2018-11-06 16:36:30
351
原创 类和对象-中(6个默认函数详解)
本文主要是对类的6个默认函数进行讲解类的默认成员函数有6个:构造函数 析构函数 拷贝构造函数 赋值操作符重载...
2018-10-31 17:53:37
316
原创 类和对象-上
引言: 在c语言中,关注着的是过程,分析出解决问题的步骤,通过函数调用逐步解决问题。 在C++中,关注的是对象,将一件事件拆分成不同的对象,靠对象之间的交互完成。由于C++是c语言发展而来的,所以C++支持C语言操作,在C语言中,描述一个问题,一般用结构体(struct),而在C++中,struct是一个类,默认情况下,所有成员都是公有的,...
2018-10-31 15:51:27
148
原创 理解命名空间,函数重载、缺省参数、指针引用
1.命名空间在c语言中,命名的名字不能和关键字冲突,不能和库函数里的名字冲突,所以在C++中,引入了命名空间。为了防止命名污染,可以在函数,变量前加上命名空间,命名空间所有内容都局限与该命名空间。使用方式: 1.当你用库函数的名字时,每次都在前加一个命名空间,例如:std::cout,std::cin。 ...
2018-10-28 22:30:12
161
原创 支持输入输出重定向,管道等功能的shell
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<sys/wait.h>#include<sys/types.h>#include<sys/stat.h>#include<fc
2018-10-19 20:20:16
372
原创 进程创建,进程等待,进程终止,进程程序替换
进程创建1.在Linux中,bash是shell的一种,它也是由操作系统创建的一个进程,但是它不可能完成操作系统给它每一个任务,所以它需要创建多个子进程完成任务,它只需要等待(进程等待),那如何创建进程呢?第一种fork:当我们调用fork后,内核做几件事情: ...
2018-10-14 11:33:15
286
原创 冯 诺依曼体系结构,操作系统,进程浅谈
一,冯诺依曼体系在我们日常生活中,大多硬件都用到了它,如计算机,手机,服务器等。知识点:存储器:指的是内存 局部性原理:在处理器和内存之间提供一个容量小且虚度快的存储器(位于被访问字附近的数据在近期被访问的概率大) 直接存储:简称DMA模块,CPU把所需要的东西都交给它,当它传完后通知CPU即可。 ...
2018-09-27 13:06:14
2997
原创 vim编译器,Makefile,yum,rpm,源码,等总结
一,vim vim是多模式文本编译器,但是我们一般只需掌握3中即可,第一种是命令模式,第二是插入模式,第三底行模式。命令模式:可以进行删除,复制,粘贴。nYY是复制,(n是复制的行数),p是粘贴,nDD(n是行数),gg是进入文本的开始G是到文本的末尾,^是移到光标所在行的首位置,$移到光标所在的行尾,b是删除回到上个字的开头,ctrl+b屏幕往后移一页。插入模式:inse...
2018-09-21 21:49:42
257
原创 插入排序,希尔排序,堆排序,选择排序,快排,归并,实现和优化
1.插入排序:从头开始遍历,当前的和前面的数去比较,如果小的话,插到前面,时间复杂度o(n^2);2.希尔排序:它是对插入排序的优化,经测得他 的效率是插入排序的100倍左右。思想:主要是把它分为几组grep,先对它几组几组的来个伪排序,grep越小越接近排好的序列,最后用插入排序 只需要把i++ 变为 i += grep,start +=grep,每次grep= grep/3即可...
2018-09-14 22:32:10
272
原创 哈希之开散列,闭散列,多阶哈希,一致性哈希
一,哈希概念哈希搜素:可以不经过任何比较,一次直接从表中得到搜素的元素。二,散列HASH(key) = key%m哈希方法中使用的转换函数成为散列函数,构造出来的结构成为哈希表。插入元素时:根据插入元素的关键码,计算出存储的位置。搜素元素时:对元素的关键码进行同样的计算,把求得的函数值当做元素存储的位置,在结构中按此位置取元素比较,若关键码相同,搜素成功。三,哈希冲突...
2018-09-07 22:05:05
742
2
原创 linux 基本指令与操作
Linux是由 Unix 发展而来的,Unix:有价值的,高效的,多用户的,多任务的操作系统Linux:开源的,(免费,稳定的系统)基本指令: 1.ls :列出当前目录下的所有子目录与文件 ls-al 列出目录下的所有文件,包括隐藏文件,并且列出详细信息 ls-R 递归列出所有子目录下的文件 ...
2018-08-17 20:39:33
291
原创 小项目之注释转换
一.将所有注释风格全部转换成C++风格想法:既然要转换风格,第一步搞清楚注释有几种方式: 第一种无注释,第二种C注释,第三种C++注释。 可以把这三种方式看成一种状态-status 第二步:C注释分几种情况:末尾结束,注释中又有C注释或者C++注释 C++注释同样考虑清楚。先写测试文件:/*int w =2;*...
2018-06-16 12:29:26
277
原创 Windows下轻松学会git工具上的beyond compare比较
1.作为一个新手,最痛苦的莫过于想学会这个工具,但没有或者很少的文章来给你讲解。2.大多都讲的很散,而且跳过了很多细节,导致你要在这个坑上踏好长时间,才能走出来。(说多了都是泪)3.没有具体的图片,这样你就不是很直观的学会它。我以一个不会者的角度去给大家讲一下:(1)首先你必须要有一个git工具吧,可以在官网下载免费的(本文章主要不讲这个)(2)git上有默认的git diff,但是不能比较汉语,...
2018-06-07 22:54:09
814
原创 动态通讯录+文件存储形式
1.要想实现动态通讯录,我们可以在静态通讯录的基础上加以修改(我前面的博客已写过)2.然后在动态的基础上加以文件形式保存,每次退出去的时候保存,下次可以读到上次的数据(1)先写头文件#ifndef _ADDR_H_ //防止头文件被重复引用#define _ADDR_H_enum //枚举的优点:防止命名污染,与define比较利于调试...
2018-06-01 20:08:53
235
原创 掌握结构体+位段+枚举+联合
一.结构体1.结构体的声明struct tag //tag是标签{ member -list; //成员列表}variable //是变量列表2.结构体可以不完全声明--也就是可以去掉tag通过类型创建内存空间,实例化3.结构体成员的访问结构体成员可以用符号 . 来访问,例如:variable.member有时我们用结构体指针来访问成员,例如:p->member,他就相当于 (...
2018-05-30 14:09:57
198
原创 很easy的静态通讯录
实现一个通讯录; 通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名、性别、年龄、电话、住址 提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系人信息 5. 显示所有联系人信息 6. 清空所有联系人 7. 以名字排序所有联系人一,要想实现一个通讯录,不要着急着写,思考清楚后,很easy第一步:把可能用到的函数声明,枚举类型,库函数都...
2018-05-30 13:14:02
182
原创 可变参数列表(模拟实现printf)
1.什么是可变参数列表?通过将函数实现为可变参数的形式,可以使得函数可以接受1个以上的任意多个参数。我们先看一个例子: int average(int n,...){ va_list arg; //相当于声明一个指针,名字为arg int i = 0; int sum = 0; va_start(arg,n); for(i=0; i...
2018-05-23 16:45:20
299
1
原创 理解数组指针,指针数组,函数指针,函数指针数组,指向指针数组的指针
1.什么是数组指针? 数组指针,其实是个指针,这个指针指向一个数组举个栗子: int arr[3]={1,3,4}; int (*p) [3] =&arr具体分析: arr是数组名,是数组首元素的地址,&arr是整个数组的地址, 由于()优先级高,所以(*p)是个指针,剩下的是指针所指向的内容,数组[3],数组包含的内容是3个...
2018-05-21 22:37:35
181
原创 模拟实现strstr,strcpy,strchr,memove,memcpy,strcat,strcmp
1.my_strcpy字符串拷贝:char *my_strcpy(char *dst ,char const *src){ assert(dst!=NULL); //断言 dst不为空指针 assert(src!=NULL); while(*dst++=*src++) { ; } return dst;}2.my_strcat字符串链接:char *my_strcat(...
2018-05-16 16:25:11
163
原创 函数栈帧(vs 编译器下)
1.什么叫函数栈帧?函数的调用过程叫栈帧,也叫函数运行时堆栈。2.这个过程,做了哪些事?这个过程要为函数开辟栈空间,用于本次函数调用中临时变量的保存,现场保护,具体来说,栈空间就是函数栈帧。3.栈帧的维护,是如何进行的?首先要知道 ebp -- 寄存器里存放了维护这个栈的栈底指针 esp -- 寄存器里存放了维护这个栈的栈顶指针下面我们以main函数来举例: ...
2018-05-14 00:10:07
668
原创 递归与非递归习题
1.递归和非递归分别实现求第n个斐波那契数。 #include<stdio.h> int fib(int n) { if(n<0) //考虑n小于0; { return 0; } else { if(n==1) ...
2018-05-12 20:29:21
239
原创 旋转字符串和判断一个字符串是否为另外一个字符串旋转之后的字符串。
一, 旋转字符串分左旋转和右旋转,但是他们的算法基本相同。 1.左旋字符串,第一种方法,大家一般是第一思维#include<stdio.h> #include<math.h> #include<assert.h> void LeftX(char *lp,int num) //num 是旋转几个字符 { ...
2018-05-08 22:48:59
400
原创 详解编译与链接(在linux系统下)
1. 翻译环境,在这个环境中源代码被转换成可执行的机器指令 每一个源文件通过编译过程转换成目标代码,每个目标文件由链接器捆绑在一起,形成一个单一而完整的可执行程序同时链接器同时也会引用标准C库函数中任何被该程序锁用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。2.执行环境,用于实际执行代码编译本身也分为几个阶段1.预处理由test.c 文件变为test.i,编译器主...
2018-05-03 22:23:46
216
原创 杨氏矩阵中查找一个数,如何去做?
我首先把你们当成面试官,来解决这道题。 1.如果不知道杨氏矩阵,先和面试官沟通一下,一定要问清楚。 //杨氏矩阵 有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。 时间复杂度小于O(N); 这是必须考虑到的 2.不着急写代码,先把思路屡清楚,数组: 1 2 3 1 2 ...
2018-05-01 00:27:38
208
原创 通过位操作解题
1.编写函数: unsigned int reverse_bit(unsigned int value); 这个函数的返回 值value的二进制位模式从左到右翻转后的值。 如: 在32位机器上25这个值包含下列各位: 00000000000000000000000000011001 翻转后:(2550136832) 10011000000000000000000000000000 程序结果返回: ...
2018-04-30 11:25:58
267
原创 从不会,到会做扫雷游戏
扫雷游戏: 1.第一次不会被炸死。 2.坐标周围没有雷,实现展开。 第一步:先建个头文件,方便我们写测试,游戏文件。 game.h 如下:#ifndef _GAME_H_ //防止头文件被重复引用,用ifndef/define/endif产生预处理块#define _GAM...
2018-04-24 20:40:19
334
原创 一步一步教你用c做三子棋小游戏
如何去做一个三子棋: 1.先创建一个头文件(game.h),可以使你在源文件里 不用很繁琐的去写库函或者是函数的声明,你的定义等等。 我的头文件如下:#ifndef _GAME_H_ //防止头文件被重复被引用,用ifnde...
2018-04-24 17:36:40
441
原创 通过for循环 实现确定比赛名次,判断凶手,打印杨辉三角
1.5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果 A选手说:B第二,我第三; B选手说:我第二,E第四; C选手说:我第一,D第二; D选手说:C最后,我第三; E选手说:我第四,A第一; 比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。 #include<stdio.h>#include<Windows.h>int main(){ int a = 0;...
2018-04-13 22:08:55
294
原创 数组在内存中的存储及sizeof 和strlen的使用
一.数组的创建和初始化1.创建方式: type_t(数组的元素类型) arr_name [const_n] (是一个常量的表达式,用来指定数组的大小)创建数组 【】必须要给一个常量才可以,不能使用变量2.数组的初始化:在创建数组的同时给数组的内容一些合理初始值)二.一维数组在内存中的存储1.数组在内存中是连续存放的,如果是整型 int 地址差4个字节 访问arr[i], 编译器,...
2018-04-13 14:09:44
238
原创 隐式类型转换
1.c的整型算数运算总是至少以缺省型类型的精度来进行的。为了获得这个精度,表达式的字符和短整型操作数在使用之前被转换为普通整型,这种转换叫【整型提升】下面我们来看个例子: char a = 2; char b = 127; ...
2018-04-10 09:07:54
157
原创 函数的练习及其使用
1实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定, 输入9,输出9*9口诀表,输出12,输出12*12的乘法口诀表。 #include<stdio.h>void print(int a){ int i = 0; int j = 0; for(i=1; i<=a; i++) { for(j=1; j<=i; j++) { printf("%2d*%2d=...
2018-04-06 13:29:29
257
原创 c语言操作符总结
操作符分类1.算术操作符+ - * / % 其中(%操作符的两个错作数必须为整数,返回的是整除之后的余数; /看两个操作数是啥类型,只要有一个是浮点型就执行浮点数除法;) 2.移位操作符警告:对于移位运算符,不要移动负数位,这是标准没有定义的;左移 :左边抛弃,右边补...
2018-04-05 17:54:58
119
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅