自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 基于HTTP实现的小型web服务器

主要流程为:服务器获得请求–>响应并处理请求–>返回结果。完整的HTTP过渡到TCP实现客户端与服务器的交互过程1.当客户端执行网络请求的时候,从url中解析出url的主机名,并将主机地址转换成ip2.从url解析出服务器的所用端口号3.客户端用TCP连接服务器4.连接成功后 获取输出流,将数据以报文的形式传递给服务器5.当服务器接收到数据之后,进行判断和解析码,并回应...

2018-09-12 22:26:09 4513

原创 C++ Primer Plus第6版重点笔记

之前看《C++ Primer Plus》第6版这本书后所做的笔记,先开始复习,整理出来。1.C++的const比C语言#define更好的原因?首先,它能够明确指定类型,有类型检查功能。其次,可以使用C++的作用域规则将定义限制在特定的函数或文件中。第三,可以将const用于更复杂的类型,比如数组和结构。C语言中也有const,其与C++中const的区别是:一是作用域规则不同...

2018-09-10 00:11:06 812

原创 NULL和nullptr区别

NULL来自C语言,一般由宏定义实现,而nullptr则是C++11的新增关键字。在C语言中,NULL被定义为(void*)0,而在C++语言中,NULL则被定义为整数0。编译器一般对其实际定义如下:#ifdef __cplusplus#define NULL 0#else#define NULL ((void *)0)#endif出现C++和C定义不一致的原因是,在C++中不允...

2018-09-09 22:55:09 1159 2

原创 从输入域名,到拿到首页的所有细节过程

深刻理解输入域名,到拿到首页的所有细节过程  以访问百度为例目录输入地址浏览器查找域名的IP地址浏览器向WEB服务器发送Http请求浏览器的永久重定向响应服务器处理请求服务器返回一个HTTP响应浏览器显示HTML从输入url到页面展示总共经过如下几个过程:域名解析(获得IP地址) 向WEB服务器发送HTTP请求 服务器处理请求 服务器返回HTTP响应...

2018-09-05 23:35:05 998

原创 CSDN--我的收藏地址

有时候看到有用的文章,点了收藏之后找不到在哪看,登录博客之后,点这个链接:http://my.csdn.net/my/favorite

2018-09-05 21:45:21 93

原创 站在不同角度对操作系统的认识

目录 站在冯诺依曼角度,理解操作系统定位站在管理角度,理解操作系统[先描述再组织]站在应用者的角度,理解操作系统 站在操作系统角度,理解系统调用接口站在操作系统角度,理解操作系统外壳程序定位与作用(Linux shell) 对比系统调用,理解库函数站在冯诺依曼角度,理解操作系统定位  冯诺伊曼(存储程序原理) 管理和控制计算机硬件与软件资源的计算机程序 ...

2018-08-28 00:30:35 1092

原创 数据结构中常见的几种排序算法

  数据结构中常见的几种排序算法快速排序目录数据结构中常见的几种排序算法快速排序插入排序希尔排序归并排序堆排序选择排序冒泡排序基数排序快速排序基本思想: 基准分割法 a) 通过一趟排序将要排序的数据分割成独立的两部分其中一部分所有的数据要比另外的一部分数据都要小 b) 按照此方法对这两部分数据进行快速排序 案例:3 6...

2018-08-27 15:52:20 4169

原创 CentOs7下 ifconfig 之后没有ip解决方法

相信大家用虚拟机会经常遇到这样的问题,我也是试了好多方法才解决的,在这了跟大家分享下我解决的方法 方法:1.先用dhclient eth0获取IP地址,2.然后运行ifconfig eth0 3.如果是静态IP 可能获取到的IP不是/etc/sysconfig/network-scripts/ifcfg-eth0 配置的IP用dhclient eth0 获得IP之后。reb...

2018-08-27 15:14:55 1246

原创 封装fork/wait等操作, 编写函数 process_create

封装fork/wait等操作, 编写函数 process_create(pid_t* pid, void* func, void* arg), func回调函数就是子进程执行的入口函数, arg是传递给func回调函数的参数.函数的格式为:int process_creat(int (*fork)(),const char* file,char *argv[])代码实现如下:

2018-04-25 19:12:30 119

原创 C++类和继承中的部分经典面试题

1.如何实现一个无法继承的类?思路:私有继承不可见,构造函数是合成的class A{public: static A* GetObj1() //静态成员函数 { return new A; //new 对象 } static A GetObj2() { return A(); //使用匿名对象拷贝构造 }private: A() {} int

2018-04-23 21:22:03 708

原创 C语言模拟实现C++中的继承和多态

继承与多态的概念 继承:是面向对象最显著的特点,继承是从已有类派生出新的类,新的类继承了已有类的数据和行为, 并能扩展新的能力,已有类被称为父类/基类,新的类称为子类/派生类;多态:按字面意思就是“多种形态”,在面向对象语言中,接口的多种不同实现方式,即为多态, 同一操作用于不同的对象可以有不同的解释,产生不同的结果,这就是多态性,简单来说,就是允许基类 指针指向父类;

2018-04-22 00:33:11 148

原创 字符串函数的模拟实现

#define _CRT_SECURE_NO_WARNINGS# include #include #include1.实现strcpychar *my_strcpy( char*dest, const char*src){ char*ret = dest; assert(dest&&src); while (*dest++ =*src++) { ; } return

2018-04-18 22:27:05 95

原创 linux下实现简单的shell

用到以下三个函数:fork:pid_t fork(void); //创建子进程int execvp(const char *file,char * const argv[]);//替换子进程pid waitpid(int *status);进程等待#include#include#include#include#include char *argv[8]={};

2018-04-18 22:09:29 142

原创 C++实现一个日期类

#define _CRT_SECURE_NO_WARNINGS#include#includeusing namespace std;class Date{public: Date(int year, int month, int day) //构造函数 { if (year >= 2000 && month > 0 && month0

2018-04-16 23:32:09 184 1

原创 new和delete解析 c++笔记

1.new/delete 和operator new/operator delete和malloc/free的关系 new,delete运算符:当我们使用一条new表达式时,实际上执行了三步操作:第一步,new表达式调用一个名为operator new(或者operator new[])的标准库函数,该函数分配一块足够大的,原始的,未命名的内存空间以便存储特定类型的对象(或对象数组);

2018-04-11 20:01:41 67

原创 类和对象

1.const成员函数 const修饰成员函数在成员函数后面加上const关键字,const修饰得是this指针指向的对象,保证调用这个const成员函数的对象在函数内不会被改变。 思考题: 1、const对象可以调用非const成员函数和const成员函数? 2、非const对象可以调用非const成员函数和const成员函数? 3、const成员函数内可以调用其他的

2018-04-11 19:01:51 72

原创 线程和进程的区别

1.程序: 为了执行特定任务的一系列指令的有序集合硬件中断技术的出现,进而软件上有了分时系统,时间片轮转2.进程:从用户角度看: 进程是程序的一次动态执行过程从操作系统的角度看:a.进程是操作系统内存分配 ,CPU时间片等资源的基本单位b.每个进程又自己独立的地址空间和进程状态(4G)c.进程是分配资源的最小单位进程是程序的一次执行过程,需要保存进程的现

2018-04-10 18:13:22 49

原创 Linux开发工具

1.常用的牛逼的编辑器, 并能够横向对比编辑器之间的区别和优缺点. gedit:是各个发行版本都有的编辑器,类似于windiws的记事本,不过可以根据代码类型着色vim:vim是一个非常强大的编辑器,但是上手难度非常高,有很多个快捷键,对于初学者来说很困难Komode Edit:KomodeEdit是一个非常强大的编辑器,和Notepad++一般。

2018-03-31 00:34:08 176

原创 C++引用和指针

1.引用的概念及用法 引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。引用(reference)是c++对c语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。定义的格式为:     类型 &引用变量名 = 已定义过的变量名; 例如:int a=5;int& b=a;这里b引用a,b是a的别名。

2018-03-30 23:06:16 203

原创 vim常用按键的使用

vim的三种模式:1.命令模式:在Linux终端中输入“vim 文件名”就进入了命令模式,但不能输入文字。 2.编辑模式:在命令模式下按i就会进入编辑模式,此时就可以写入程式,按Esc可回到命令模式。 3.末行模式:在命令模式下按:进入末行模式,左下角会有一个冒号出现,此时可以敲入命令并执行。 三种模式切换方法:常用按键的使用 i 进入输入模式 :w保存:q退出

2018-03-30 17:10:35 182

原创 Linux进程的七种状态

七种状态转换图一个进程在其生存期内,可处于一组不同的状态下,称为进程状态,如下图所示。进程状态保存在进程任务结构的state字段中。当进程正在等待 系统中的资源而处于等待状态时,则称其处于睡眠等待状态。在Linux系统中,睡眠等待状态分为可中断的和不可中断的等待状态。运行状态(TASK_RUNNING)。当进程正在被CPU执行,或已经准备就绪随时可由调度程序执行,则称该进程

2018-03-30 12:10:06 2405

原创 进程的三种状态及其转换

1.进程的三种基本状态:进程在运行中不断地改变其运行状态。通常,一个运行进程必须具有以下三种基本状态: ①就绪(Ready)状态 当进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行,进程这时的状态就称为就绪状态。在一个系统中处于就绪状态的进程可能有多个,通常将他们排成一个队列,称为就绪队列。 ②运行状态 进程已获得CPU,其程序正在执行。在单处理机系统中

2018-03-30 00:05:39 4532

原创 C++

1.了解下c++C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。2.为什么C++支持重载?C语言不支持--重点 在同一作用域类,一组函数的函数名相同,参数

2018-03-26 22:17:57 220

原创 链表面试题

////////////////////////////////////////////////////////////////////////////////////链表的面试题//////////////////////////////////////////////////////////////////////////////////1.从尾到头打印单链表//非递归void SL

2018-02-28 19:59:56 134

原创 扫雷小程序

1>第一次下子,不炸死。 2>坐标周围没雷,可以实现展开。game.h#ifndef __GAME_H__ #define __GAME_H__ #include #include #include #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #de

2018-02-23 18:21:59 286 1

原创 C语言实现简单的三子棋小程序

1 game.h中用于函数定义#ifndef __GAME_H__#define __GAME_H__#include #include #include #include #define ROW 6#define COL 6void InitBoard(char board[ROW][COL], int row, int col);void DisplayBoard(

2018-02-22 13:02:51 795

原创 时间复杂度和空间复杂度的计算

时间复杂度1. 一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=O(f(n))分析:随着模块n的增大,算法执行的时间的增长率和 f(n) 的增长率成正比,所以 f(n) 越小,算法的时间复杂度越低,算法的效率越高。2. 在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出 T(n) 的同数

2017-12-11 13:53:47 5394 1

原创 模拟实现qsort函数

模拟实现qsort函数qsort 的函数原型是void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));qsort(即,quicksort)主要根据你给的比较条件给一个快速排序,主要是通过指针移动实现排序功能。排序之后的结果仍然放在原来数组中。参

2017-12-10 17:11:58 107

原创 自定义类型(结构体,位段,枚举,联合)总结

结构体结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。结构体的定义方式:struct 结构体名{    结构体所包含的变量或数组};例如:struct Student{      //声明一个结构体类型Student  int num;          char name[20];    char sex;      

2017-11-27 23:57:30 154

原创 用递归和非递归方法求第n个斐波那锲数

斐波那契数列:1,1,2,3,5,8,13,21……这个数列从第三项开始,每一项都等于前两项之和。如果设F(n)为该数列的第n项(n∈N+)。菲波那切数列可以概括成如下形式:在这里我们输出第6个斐波那锲数 递归方法#define _CRT_SECURE_NO_WARNINGS# include int fib(int n){while (

2017-11-20 23:25:10 2034

原创 指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针 的理解

首先我们要知道什么是指针指针是C语言中广泛使用的一种数据类型。 指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。简单来说,指针就是地址。 指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身

2017-11-19 00:09:31 126

原创 调整数组使奇数全部都位于偶数前面

输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。#define _CRT_SECURE_NO_WARNINGS#include #include #include void my_change(int *p, int len){ int *q = p + len - 1; int temp; assert

2017-11-14 23:04:48 86

原创 求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,例如:2+22+222+2222+22222

#define _CRT_SECURE_NO_WARNINGS#include #include int main(){ int a = 0; int i = 0; int sum = 0; int n = 0; printf("输入所求的项数:"); scanf("%d", &n); for (i = 1; i <= 5; i++) { a = a * 10 + n

2017-11-14 21:11:06 119

原创 求出0~999之间的所有“水仙花数”并输出。

“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身,如;153=1+5+3?,则153是一个“水仙花数”。 在数论中,水仙花数(Narcissistic number)也称为自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),是指一N位数,其各个数之N次方和等于该数。 例如153、370、371及407就是三位数的水仙花数,其各个数之立方和等于该数

2017-11-14 21:08:15 107

原创 编写一个程序,可以一直接收键盘字符,如果是小写字符就输出对应的大写字符,如果接收的是大写字符,就输出对应的小写字符,如果是数字不输出

#define _CRT_SECURE_NO_WARNINGS#include #include void main(){ char c = 'a'; printf("请输入一个键盘字符c:"); scanf("%c", &c); if (c >= 'A' && c<= 'Z') { c = c+ 32; } else if (c >= 'a' && c <= 'z')

2017-11-14 21:06:04 119

原创 写代码可以在整型有序数组中查找想要的数字,找到了返回下标,找不到返回-1.(折半查找)

例如在这里查找数字6#define _CRT_SECURE_NO_WARNINGS#include #include int my_search(int arr[], int key, int left, int right){ while (left <=right) { int mid = left + (right-left) / 2; if (key <arr[mid]

2017-11-14 21:04:09 261

原创 函数调用栈帧过程 图解

函数的调用栈帧过程的常用指令1、add:加法指令,第一个是目标操作数,第二个是源操作数,格式为:目标操作数= 目标操作数+ 源操作数;2、call:调用函数,一般函数的参数放在寄存器中;3、ret:跳转会调用函数的地方。对应于call,返回到对应的call调用的下一条指令,若有返回值,则放入eax中;4、push:把一个32位的操作数压入堆栈中,这个操作在32位机中会使得e

2017-11-13 23:47:06 405

原创 编写一个函数完成n^k计算

编写一个函数完成n^k计算#define _CRT_SECURE_NO_WARNINGS#include#include#includeint my_pow(int n, int k) { if (k == 0) { return 1; } else if (k == 1) { return n; } return n*my_pow(n, k - 1);}

2017-11-09 17:58:32 419

原创 写一个宏实现一个数的奇数位和偶数位交换

假设我们需要交换的数字为x将(x&(0x55555555))将(x&(0xAAAAAAAA))>>1; x按位与0xAAAAAAAA后得到的二进制偶数位与x相同但奇数位均为0,然后再向右移一位,奇数位变为原来的偶数位,且移动后偶数位全为0;通过将两个二进制按位或((x&(0x55555555))>1)就可以得到最终的数字。#define _CRT_SECURE_NO_WAR

2017-11-09 16:27:52 97

原创 C语言关于数组知识点总结

数组数组本身是一种构造数据类型,主要将相同类型的变量集合起来,用一个名称来代表。数组也是一种自定义类型,使用之前要先定义,以便编译程序能分配内存空间供程序使用。一维数组的定义一维数组的定义形式:数据类型  数组名[整形常量表达式];(1)数据类型:规定数组的数据类型。(2)数组名:表示数组的名称,命名规则和变量名相同,为任一合法的标识符,不要与其他变量名或关键字重名。

2017-11-07 21:36:39 1284 2

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