- 博客(29)
- 收藏
- 关注
原创 Nginx内存池的一些理解
内存管理中为避免内存碎片,nginx管理内存技术在此理解:结构图如下:一、内存池的数据结构在nginx内存池中有一个头部,头部里又包含一个数据部,数据部主要用来为用户分配小块内存。数据部之外主要为用户分配大块内存、管理外部资源、日志信息以及内存池的一些其他信息。ngx_pool_s的ngx_pool_data_t中:last:是一个unsigned char 类型的指针,保存的是/当前...
2018-10-22 20:32:16
1263
原创 堆排序
堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。/*父->左子2n+1 父->右子2n+2子->父 (n-1)/2一次调整建立大根堆,根最大。每个结点的值都大于或等于其左右孩子...
2018-06-15 20:13:51
222
原创 快速排序的递归非递归
快速排序: 即一趟快速排序的过程,返回基准。基准:平分数据段 时间复杂度:好情况(无序的数据):O(nlog2n) 坏(有序):O(n2) 空间复杂度:O(log2n) 算法稳定性:不稳定 原理:采用分治思想,在待排序的序列中选取一个值作为一个基准值,按照这个基准值得大小将这个序列划分成两个子序列,基准值会在这两个子序列的中间,一边是比基准小的,另一边就是比基准大的。这样快速排序第一次排...
2018-06-15 11:07:43
813
1
原创 BF算法与KMP算法
针对串的操作,在主串s里面查找子串sub,从pos位置开始的第一个符合的子串,返回第一个字符的下标。 BF算法如下: 时间复杂度:O(mn) 当字符相等时,j++,i++,当不等时,j需要回退到0号下标,i需要回退到之前的位置+1int BF(const char *s,const char *sub, int pos)//在s里面查找子串sub,从pos位置开始的第一个符合的子串,返...
2018-06-12 22:20:38
1615
原创 选择排序,冒泡排序,直接插入排序,shell排序
一、选择排序: 时间复杂度:无序O(n^2) 有序O(n) 空间复杂度:O(1) 算法稳定性:不稳定(相同数值都交换了) 原理:选择一个值arr[0]作为标杆,然后循环找到除这个值外最小的值(查找小于标杆的最小值), 交换这两个值,这时最小值就被放到了arr[0]上,然后再将arr[1]作为标杆,从剩下未排序的值中找到最小值, 并交换这两个值。 例:4 1 5 12 0 第一趟:1...
2018-06-12 15:53:18
292
原创 顺序表的相关基本操作实现
静态: seqlist.h#pragma once//防止头文件多次引用#define MAX_SIZE 100typedef struct seqlist{ int arry[MAX_SIZE]; int size;//有效数据的长度 }seqlist;void InitSeqList(seqlist *seq);//初始化bool InsertSeqlist(...
2018-05-12 15:29:59
264
原创 const和define的区别
①编译器处理方式不同 define宏是在预处理阶段展开。 const常量是编译运行阶段使用。②类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开。 const常量有具体的类型,在编译阶段会执行类型检查。③存储方式不同 define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。 const常量会在内
2017-12-25 21:45:03
202
原创 常见字符串函数的实现
strlen(),strcpy()int my_strlen(const char *str)//字符串长度{ assert(str != NULL); int len = 0; while (*str ++ != '\0') { ++ len; } return len; }char *my_strcpy
2017-12-24 20:52:35
4783
原创 单链表的基本操作
基本操作的声明:typedef struct Node{ int data;//数据 struct Node *next;//指向下一个结点}Node, *List;//对单链表的操作void InitList(List plist);//初始化单链表bool Insert_head(List plist, int val);//头插法bool Insert_tail(L
2017-12-24 20:42:36
277
翻译 switch和if else的效问题
详细描述switch与ifelse的区别。 switch...case与if...else的根本区别在于,switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch...case不用像if...else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。具体地说,switch.
2017-12-12 22:15:05
266
原创 linux库及静态库及动态库的创建
库:库是一组预先编译好的函数的集合,这些函数都是按照可重用的原则编写的。它们通常由一组相互关联的函数组成以执行某项常见任务,比如屏幕处理函数库和数据库访问例程。库分为静态和动态库两种,这里先介绍一下静态库的建立。 Linux的库一般在/lib或/usr/lib目录下。lib是库(Library)的英文缩写,它主要存放系统的链接库文件,没有该目录则系统就无法正常运行。/lib目录中存储着程
2017-12-10 21:46:01
244
原创 程序编译过程
在运行一个程序时,事实上经过了预编译,编译,汇编,链接四个过程。只不过我们在运行程序时,这些步骤被隐藏了。①预编译:把源代码文件如main.c,被预编译成一个.i文件。在linux下的命令为:gcc-E main.c -o main.i预编译的具体任务:1.将所有的“#define”删除,并展开所有的宏定义。2.处理所有条件预编译指令。3.处理头文件预编译指令,将被包含
2017-12-07 21:17:41
361
1
原创 static关键字在c语言中的应用
static关键字在c语言中主要有两个作用。一、修饰变量。变量又分为局部变量和全局变量,但他们都在内存的静态区,静态变量只能被初始化一次。 静态全局变量,作用域仅限于被定义的文件中,其他文件即使用extern声明也没法使用它。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些代码行也不能使用它。想要使用就得在前面再加extern。。 静态局部变量,在函数体内
2017-11-20 21:26:16
385
原创 C语言中引用及指针和引用的联系与区别
引用:引用是一个变量的另一个名字,又称别名。定义方式: int a=10; int &b=a;在这里,意思就是给a变量起了一个新名字b,因此b不可再次被重新定义。 引用必须初始化,无空引用,并且引用不分等级。 引用与指针的异同点: 相同点:在引用中 int &b=a;这一句代码可被编译器看做int * const b=&a;//加上const的作用是表明指针b的自身的值(a的地址)不能改变
2017-10-28 16:51:53
23697
5
原创 数组的使用及与指针的联系
数组,顾名思义就是一组数据的集合即一批具有同名的同属性的数据就组成一个数组。由此可知,①数组是一组有序数据的集合。②用一个数组名和下标来表示确定数组中的元素。③数组中的每一个元素都属于同一个数据类型。 数组的定义: 例:int a[10] 表示数组名为a,数组长度有10个整形元素。 类型符 数组名[常量表达式]
2017-10-20 22:33:49
449
原创 九九乘法表及杨辉三角C语言实现
九九乘法表:void main(){int i,j;for(i=1;i<=9;i++){for(j=1;j<=i;j++){printf("%d*%d=%d\t",j,i,i*j);}printf("\n");}}杨辉三角:void main(){int a[10][10];int i,j;for(i=0;i<10;i++){ a[i][0]=1; a
2017-10-16 21:03:59
566
原创 #define与#undef
#define,无参宏定义的一般形式为:#define 标识符 字符串(例:#define Max 10)。define函数定义一个常量。常量类似变量,不同之处在于:在设定以后,常量的值无法更改。常量值只能是字符串或者 数字。 #undef ,就是取消一个宏的定义,之后这个宏所定义的就无效;但是可以重新使用#define 进行定义。 1.在一个程序块中用完宏定义后,为防止后面标识符冲突需要取
2017-10-15 22:41:43
2862
原创 C语言中定义和声明的一些差别
定义:所谓的定义就是(编译器)创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名或对象名。一个变量或对象在一定的区域内(比如函数内,全局等)只能被定义一次,如果定义多次,编译器会提示你重复定义同一个变量或对象。 变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。 声明:告诉编译
2017-10-15 22:20:27
706
原创 可见性与生存期
1.可见性=>编译器2.生存期=>执行时若定义一全局变量,则该变量可贯穿整个程序,在任何地方都可以被编译识别。若又定义一个 局部变量与全局变量重名时,则变量取值采取就近原则,即局部变量,倘若非要全局变量,则在变量前必须加上::表示全局变量。块区域在局部中,快中定义的变量只能在块中使用,出块则不能使用,得重新定义。若块中变量与局部变量名冲突,则也遵循就近原则,但在这里若
2017-10-14 12:53:02
333
原创 跳出语句:go to,break,return,continue的差别
go to:goto语句也称为无条件转移语句,其一般格式如下: goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标号后加冒h号(:)。语句标号起标识语句的作用,与goto 语句配合使用。goto语句的语义是改变程序流向, 转去执行语句标号所标识的语句。goto语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。bre
2017-10-14 12:21:34
7065
转载 inline关键字
一、什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数。 栈空间就是指放置程式的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足所造成的程式出错的问题,函数的死循环递归调用
2017-10-11 21:25:49
223
翻译 char ch[100]; char *str; gets(ch); gets(str);
char ch[100]; char *str; gets(ch);//输出小于数组长度内部的字符的值 gets(str);//str首先要分配空间,将指针p分配一组字符串内存地址,指针的作用是保存一个内存地址。将指针str分配一组字符串内存地址如下str = (char *)malloc(NUM*sizeof(char)); gets()函数:从流中读取字符串。
2017-09-29 21:11:35
2788
翻译 char ch[10]={"yhping"}; char ch2[10]={'y','h','p','i','n','g'}; char *str = "yhping"; 区别是什么。
char ch[10]={"yhping"};//字符串数组,用字符串常量进行初始化 不能改变大小或重分配 但可改变内容。在栈上申请空间,将常量内容复制进来,所以是局部变量。它等价于char ch[10]={'y','h','p','i','n','g','\0'};系统自动在后面加了一个'\0',作为字符串结束的标志,后3个元素为空字符。char ch2[10]={'y','h','p','
2017-09-29 20:34:25
1361
翻译 #define PINT int*与typedef int *SINT的区别.
#define PINT int* #define是预处理指令,简单的宏定义,在编译预处理时进行简单的替换,不作正确性检查,不管含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。①#define PINT int*是,在预处理阶段就已经将PINT替换为int*了,它与int *不等价②如果有PINT a,b; //实际就是 int* a,b;
2017-09-29 19:16:16
698
翻译 printf()函数
printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出 信息。在编写程序时经常会用到此函数。函数的原型为: int printf(const char *format, ...); 函数返回值为整型。若成功则返回输出的字符数,输出出错则返回负值。 printf()函数的调用格式为: printf("", );//这里看输出很简单,前
2017-09-27 20:31:31
280
原创 指令系统的寻址方式大致汇总
指令寻址:1.顺序寻址:通过程序计数器pc加1,自动形成下一条指令的地址。2.跳跃寻址:通过转移类指令直接或间接给出下一条指令的地址。数据寻址:1.隐含寻址:操作数地址不明显的给出,隐藏在指令中。2.立即寻址:给出的不是操作数的地址,而是操作数的本身。3.直接寻址:直接给出操作数的真实地址。4.间接寻址:给出操作数有效地址所在的存储单元的地址。5.寄存器寻址:直接给
2017-09-27 20:14:08
3586
翻译 #define、const、enum的用法及区别
define,无参宏定义的一般形式为:#define 标识符 字符串(例:#define Max 10)。define函数定义一个常量。常量类似变量,不同之处在于:在设定以后,常量的值无法更改。常量值只能是字符串或者数字。①被定义为“宏”的标识符称为“宏名”。在编译处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去替代,这称为“宏代替”。宏定义是由源程序中的宏定义命令完成的。宏代替是由
2017-09-27 16:38:38
878
翻译 c语言中sizeof()的特点及用法
定义:sizeof是计算对象所占的字节数,通常用来查看变量、数组或结构体等所占字节个数的操作运算符。 形式:sizeof()有三种语法形式:1)用于数据类型:sizeof(type_name);//sizeof(类型);2)用于变量:sizeof(object);//sizeof(对象);sizeof object;//sizeof 对象;例:void main(){
2017-09-22 19:38:51
7246
1
转载 指令与寄存器
EAX、ECX、EDX、EBX:為ax,bx,cx,dx的延伸,各為32位元ESI、EDI、ESP、EBP:為si,di,sp,bp的延伸,32位元eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 汇编语言中CPU上的通用寄存器的名称,是32位的寄存器。比方说:add eax,-2 ; //可以认为是给变量eax加上-2这样的一个值。这些
2017-09-21 10:29:42
1246
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人