随笔分类 - C语言学习
记录自己学习C语言的知识总结
摘要:队列是一种特殊的线性表,与堆、栈有点类似,但是队列值允许从队列的前端(Front)进行出队(删除),队列的后端进行插入(进队)。 实际的应用中,使用的是循环的队列。 循环队列的本质:是一个数组,只不过这个数组是可以被循环地进行存放数据。 2、循环队列的创建 typedef struct Queue { int *pBase; int Front; ...
阅读全文
摘要:1、顺序排序:数组内部做排序 第一个和第二个做比对,第一个和第三个多比对,第一个和第四个做比对,以此类推。 //顺序排序 void sort_xunxu(int * a,int n) {// a 数组地址,n: 数组的长度 int i, j; int tmp = NULL; for (i = 0; i a[j]) ...
阅读全文
摘要:1、二分法的查找 一般而言,二分法是在数组当中,且数组的内部也是已经做好了从大到小或者从小到大的排序了,我们需要在这些排序中找到我们需要的数值。 int binart(int *a, int key, int n) { int left = 0, right = n - 1,mid = 0; mid = (left + right) / 2; wh...
阅读全文
摘要:1、野指针 野指针是指向了“垃圾”内存的指着。 2、产生原因 (1)指针变量没有被初始化。任何指针变量刚刚被创建的时候,是不会自动变成NULL指针的,他的缺省值是随机的,这个时候指针是乱指的。所以指针变量在被创建的同时应该被初始化,让指针指向合法的内存。 (2)指针P被free或者delect之后,没有设置为NULL;当指着被free之后,其...
阅读全文
摘要:对于非常简单的scanf函数,一直使用,但是却是有很多的知识点没有掌握好,现总结如下: 1、多个scanf之后,后序以 scanf("%c",&c) 当程序连续调用scanf 函数的,前面的获得输入接收的时候,一般结束都是以一个空白字符(空格、enter),比如enter 结束输入;但是,当后面接着是还有一个以 scanf("%c",&a) 的时候,则上面输出 enter 作为结束...
阅读全文
摘要:Linux 应用程序的内存分配中,是用 segment(段)进行区别的,使用 size 命令进行查看: size a.out text data bss dec hex filename 1639 264 8 1911 777 a.out 可...
阅读全文
摘要:1、声明: 一般来说,身后名是加了 extern 关键字,比如: extern int a; // 只是声明 这个过程,是声明,告诉编译器,这个变量已经在别的地方定义过了,这个只做基本的声明,这个过程并没有为其分配内存。 2、定义: int x; // 声明 + 定义 完成了定义,事实上,定义就包含了声明,编译器会为其分配内存。...
阅读全文
摘要:1、区别 (1)定义、执行时间、作用域 定义、执行时间: #define pchar char * typedef char *pchar; 定义的格式差别,显而易见的,要注意,define 是不能存在分号的(文本替换),而typedef 是存在逗号的(类型的重命名)。 同时,define 由预处理
阅读全文
摘要:一、自己学习链表 数组的缺点:(1)数据类型一致;(2)数组的长度事先定好,不能灵活更改。 从而引入了链表来解决数组的这些缺点:(1)结构体解决多数据类型(2)链表的组合使得链表的长度可以灵活设置。 基本概念:头结点: 这个节点是为了便于管理链表的节点,这个节点并不保存数据;虽然和其他节点一样,但...
阅读全文
摘要:对于C语言中,一般的理解是对于空格,我们可以随意输入,因为空格没啥大意义,但是事实上并非如此。1、'\'空格的问题 '\' 字符可用于一些字符进行转移,当然也包括了 newline(enter),被转义的 newline 在逻辑上是对上一行的延续,可以用于连接长长的字符串。但是,如果在:\ente...
阅读全文
摘要:C语言的类型转换,一个是强制类型进行转换,而在这里要介绍的是自动的数据类型的转换,自动的数据类型转换很多时候是发生在多种数据类型混合使用的时候就会进行类型的转换,这样就会带来不能控制的结果,所以必须进行学习。1、算术进行类型转换 在进行算术运算(加减乘除、相除、大小)的时候,当数据类型不一致的时候...
阅读全文
摘要:1、状态机 简称为FSM(finite state machine),也就是有限个状态机,机器(程序)在接受到外部的信息输入之后,考虑到当前的状态和用户输入的信息从而去执行相应的动作(输出)。 状态机的分类:MOORE、MEALY: MOORE: 执行的动作(输出)之和当前状态有关和输入无关。 MEALY: ...
阅读全文
摘要:1、const 的理解 const 是C语言的一个关键字,需要注意的是,const 关键字是把变量变为一个只读的变量(也就是不可以作为左值),绝对不是将这个变量变为常量。也就是说经过const 修饰的变量成为只读的变量之后,那么这个变量就只能作为右值(只能赋值给别人),绝对不能成为左值(不能接收别人的赋值)。 而 C++ 则是将 const 修饰的常量变为一个真正的常量(变量的内容不...
阅读全文
摘要:1、操作系统 1.1、Linux 内核(系统)的组成的部分: 内核主要有:进程调度、内存管理、虚拟文件系统、网络接口和进程通信五个部分组成。 (1)进程调度 进程调度是CPU对多个进程对CPU访问的调度算法,使得进程宏观上并行执行。常用的调度算法有:先来先服务原则、高优先级别优先、短进程优先(谁执行
阅读全文
摘要:1、函数库 函数库其实就是一些写好的函数集合,方便别人的复用。实现的封装之后,最终的目的都是给别人调用。 2、库的形式 库的形式分:动态链接库和静态链接库。 优点: (1)库文件都是被编译好的二进制文件,别人看不到源代码,可以保持保密;(2)同时不会因为不小心被修改出现问题,便于维...
阅读全文
摘要:1、编译的过程 源码.c->(预处理)->预处理过的.i源文件->(汇编)->汇编文件.S->(编译)->目标文件.o->(链接)->elf可执行程序 预处理:预处理器 汇编 :汇编器 编译 : 编译器 链接 : 链接器 预处理就是调用预处理器做一些代码的前期执行动作,使得编译器可以专心只做和编译相关的事情。 2、常...
阅读全文
摘要:1、联合体(共用体)union U{ char s[9]; int n; double d; }; 联合体和结构体的定义和使用是一样的,就不详细的赘述。必须要记住:联合体所有的成员变量都是共享同一块内存的,从相同的起始地址进行赋值。也就是给联合体的一个成员变量赋值的时候,就会改变...
阅读全文
摘要:1、结构体 C语言中,结构体是一块连续的内存,各个成员按照定义的顺序,一次尽心存放,编译器会按照语法进行分析之后,计算需要的大小空间进行分配,为了每个成员都可以被快读访问到,所以需要进行地址对齐,struct MyStruct{ int a; char b; int c;}; 一个...
阅读全文
摘要:1、字符串 严格意义上来说,C语言并没有字符串原生的字符串的类型,而是通过字符指针来实现的:char *p = "LINUX";。而对于其他的高级语言来说,比如C++的就存在字符串类型: string p1 = "I LOVE LINUX"; 。 字符串在内存中其实就多个字节组成的,且地址都是连续的
阅读全文
摘要:1、内存的区域 对于内存的区域划分上,不同的区域划分上都各有不同。 划分1: 代码区、堆、栈、 全局区(静态存储区)、 文字常量区、 划分2: 代码段、堆、栈、 data段、BSS段、文字常量区 全局区: 又成为静态存存储区。保存的是全局变量和静态变量(带有static 关键字)。全局区分为两个区域:一个区域保存的是经过初始化,且初始化的...
阅读全文