【操作系统】期末试卷考点整理

Snip20160628_107
不管系统中是否有线程,进程都是拥有资源的独立单位
管程技术是用来解决进程同步的
对进程的管理和控制使用的是原语
并发执行的特征:间断性、失去封闭性、不可再现性
在单处理机系统实现并发后,各进程在某一时间段并行运行,CPU与外部设备之间并行工作
文件系统的主要目的是实现对文件的按名存取
通道控制设备控制器,设备在设备控制器控制下工作
操作系统的基本类型是实时系统、分时系统和批处理系统
PMT 页表(页面变换表) DCT设备控制表
虚拟存储器的叙述正确的是:要求程序运行前不必全部装入内存且在运行过程中不必一直驻留在内存
虚拟存储器采用了以“时间”换“空间”的技术
在可变分区存储管理中,最优适应分配算法要求对空闲区表项按尺寸从小到大进行排列
并发是指若干个事件在同一时间段内发生, 并行是指若干个事件在同一时刻发生。
进程的基本特征有动态性、并发性 、独立性、异步性及结构特征

Ch1
1.从用户、资源管理、资源抽象三个角度看,操作系统的作用分别是什么。(p2-3,选择题、简答题)
OS作为用户与计算机硬件系统之间的接口;
OS作为计算机系统资源的管理者;
OS实现了对计算机资源的抽象
1.操作系统是什么软件?位于哪一层之上?(P1填空题,选择题)
OS是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩充。OS是现代计算机系统中最基本最重要的系统软件。
1.从资源管理的角度看,操作系统的4大主要功能。(P16-19填空题)
处理机管理,存储器管理,设备管理,文件管理
1.理解操作系统的主要特性:并发、共享、虚拟和异步。其中操作系统最基本的两个特征是什么?(P13-14选择题)
并发和共享是操作系统最基本的两个特征
1.理解操作系统的基本类型:批处理操作系统(了解优缺点P7)、分时操作系统(P9了解2个关键问题,了解特征)和实时操作系统。(P10选择题,什么是硬实时任务与软实时任务的)
批处理操作系统的优点:资源利用率高,系统吞吐量大。
批处理操作系统的缺点:平均周转时间长,无交互能力。分时操作系统的2个关键问题:及时接收,及时处理
分时操作系统的特征:多路性、独立性、及时性、交互性

实时操作系统:实时操作系统的特征比分时多一个可靠性。
1.多道程序设计是指什么?(P7-8选择题)
多道程序设计是指内存中存放多个进程来执行调度任务,内存中多个进程共享计算机资源
1.操作系统作为用户与计算机硬件系之间的接口,用户可通过三种方式使用计算机,这些方式是指什么。(P2填空题)
命令方式、系统调用方式、图标-窗口方式

Ch2
1.理解进程的定义, 进程的3个组成部分。(P35-36选择题、填空题)
Snip20160628_108
进程的定义:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
进程的组成部分:程序段、相关的数据段和PCB控制块
1.理解进程的三种基本状态转换及用图表示。(P37选择题,简答题)
就绪   阻塞  执行
1.进程控制块PCB中的4个方面的信息,进程与PCB之间的对应关系。(P40-41选择题、填空题、简答题)
进程控制块的组成:进程标识符,处理机状态,进程调度信息,进程控制信息。
进程与PCB是一一对应的关系。当系统建立一个新进程时,就为它建立一个PCB。进程结束时又收回它的PCB,进程也随之消亡。系统是通过PCB感知进程存在的。PCB是进程存在于系统中的唯一标志。
1.进程控制一般是由什么来实现的?(P42选择题)什么是原语?(P43选择题)
进程控制一般由OS内核中的原语来实现。
原语就是由若干条指令组成的,用户完成一定功能的一个过程。它是一个不可分割的基本单位。原语在执行的过程中不可以被中断。
1.在多道程序设计系统中,并发进程之间可能存在的2种制约关系(也就是,并发进程之间可能存在的2种关系,并区分):进程互斥和进程同步(P48填空题、选择题)
间接相互制约关系:因为对临界资源共享的互斥访问而引起的
直接相互制约关系:为了完成某任务而建立的两个或者多个进程之间的制约关系
1.线程与进程的区别。(选择题)
进程作为调度和分派的基本单位,线程是能够独立运行的基本单位
线程使OS具有更好地并发性
进程可以拥有资源,并作为系统中拥有资源的一个基本单位。线程本身并不拥有系统资源,而是仅有一点必不可少的、能保证独立运行的资源。
不同线程之间的独立性比不同进程之间的独立性低的多。
线程创建或撤销的开销小于进程的创建和撤销的开销。
在多处理系统中,多线程进程可以将一个进程中的多个线程分配到多个处理机上,并行执行。
1.并发进程的特征(与顺序程序设计相比):(选择题)
间断性、失去封闭性、不可再现性
2.临界区(P50)、临界资源的定义(P14填空题、选择题、简答题)
临界区:访问临界资源的那段代码。
临界资源:一段时间内只允许一个进程访问的资源。(每个进程应采取互斥访问的方式,实现对这种资源的共享)
1.同步机制应遵循基本准则(或临界区调度原则)(P50填空题、简答题)
空闲让进、忙则等待、有限等待、让权等待
Snip20160628_109
1.信号量:(填空题、选择题)
2.一种是用于实现进程互斥的信号量,初值一般为1;当为0时表示什么含义。
= 1表示只允许一个进程访问临界资源
= 0 表示一个进程已进入临界区
(2)另一种是用于解决进程同步的信号量,初值表示资源的数量。 有两种题型:
【题型1】有3个进程共享同一程序段,而每次最多允许两个进程进入该程序段,若用P、V操作作同步机制,则记录型信号量S的取值范围为(-1 0 1 2)。
【题型2】若记录型信号量S的初值为2,当前值为-1,则表示有(  1)等待进程。
信号量为负时,表示资源分配完毕,信号量的绝对值表示已阻塞进程的数目
1.利用信号量实现前驱关系(P57图2-14类似,程序填空题)、
进程向后继进程分配信号量,后继进程等待接收前驱进程的信号量
Snip20160628_110
1.了解管程的作用,即用来做什么的(选择题)
管程的作用:确保每次仅有一个进程进入管程,执行这组过程,使用共享资源,达到对共享资源所有访问的统一管理。

Ch3
1.了解处理器调度的3种调度是什么及其调度对象分别是什么。了解进程调度的任务。(填空题、选择题)
3种调度——高级调度:长程调度或作业调度
中级调度:进程调度或短程调度
低级调度:内存调度
进程调度的任务——保存处理机的现场信息
按某种算法选取进程
把处理器分配给进程
1.(填空题、综合题)周转时间的计算(采用先来先服务调度算法和最短作业优先调度算法时的平均周转时间)
题型:设有三道作业,它们的提交时间和运行时间如下表:
Snip20160628_102

求:试给出下面两种调度算法下,作业的执行顺序、平均周转时间和平均带权周转时间。
(1)先来先服务FCFS调度算法
Snip20160628_103
作业的执行顺序: 1  2   3
平均周转时间:T = (2 + 2.9 +3) / 3 = 2.63
平均带权周转时间:T = (1 + 2.9 + 12) / 3 = 5.3
(2)短作业优先SJF调度算法
Snip20160628_104
作业的执行顺序:1 3 2
平均周转时间:T = (2 + 2.25 + 3.15) / 3 = 2.46
平均带权周转时间:T = (1 + 9 + 3.15) / 3 = 4.38

1.了解基本的作业调度和低级调度算法:先来先服务算法FCFS、最短作业优先算法SJF、响应比最高者优先算法HRRF和优先级调度算法。(填空题、选择题)
高响应比优先算法:优先权 = (等待时间 + 要求服务时间) / 要求服务时间
高响应比优先算法既考虑了作业的等待时间,又考虑作业运行时间
优先级调度算法(既可用于作业调度又可用作进程调度):从后备队列中选择若干个优先级最高的作业装入内存。

1.死锁的定义及其产生死锁的原因和必要条件(简答题、选择题)
死锁:一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件,那么该组进程是死锁的
产生死锁的四个必要条件是:互斥条件、请求和保持条件、不可抢占条件、循环等待条件。
1.银行家算法(参加书上例题P113,综合题)
2.求系统中各种资源的总数
已经分配出去的资源 + 系统当前可用的资源 = 系统中各种资源的总数
1.某时刻各进程对各资源的需求数目即Need矩阵。
Need[i, j] = Max[i, j] – Allocation[i, j]
3.在某时刻系统是否是安全的(找安全序列)
安全性算法中,work表示系统可提供给进程继续运行所需的各类资源数目,执行安全算法开始时,work = available

步骤:利用安全性算法对xx时刻的资源分配情况进行分析
建立表格:work(第一个已知,其他都是上一行的work+allocation)、need(已知)、allocation(已知)、work+allocation、finish(true or false)
在xx时刻存在着一个安全序列{xx,xx,xx,xx},故系统是安全的
4.如果此时某进程发出资源请求向量Request( ),是否能实施资源分配?为什么?
1.request1 < need1
2.request1 < available
3.系统先假定可以为p1分配资源,并修改available allocation1 和 need1向量
4.再利用安全性算法检查此时系统是否安全
5.由所进行的安全性检查得知,可以找到一个安全序列{x,x,x,x}。因此系统是安全的

Ch4
1.存储管理是对内存的什么区域进行管理?
用户区
1.了解逻辑地址与物理地址的概念,重定位的概念(填空题)
逻辑地址(Logical Address) 是指由程序产生的与段相关的偏移地址部分
物理地址(Physical Address) 是指出现在CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果。
重定位就是把程序的逻辑地址空间变换成内存中的实际物理地址空间的过程,也就是说在装入时对目标程序中指令和数据的修改过程。
1.理解常用动态(可变)分区分配算法:
(1)首次(最先)适应算法、(2)最佳适应算法、(3)最坏适应算法。它们的空闲区表项是按什么规则排列(空闲链表)。(填空题、选择题)
首次适应算法即每次都从头遍历找到第一个符合的分区,最佳适应的是每次都找到那个和它大小相差的最小的那个分区,最坏适应算法,是每次都找最大的那个分区

1.动态(可变)分区分配方案中,某一作业完成后,系统收回其主存空间,了解回收空闲区的4种情况的回收规则,空闲分区表的变化。(填空题、选择题)

1.分页存储管理的原理(填空题,综合题)
题型:分页式存储管理系统,内存的大小为64KB,被分成16块,块号为0、1、2、…、15。设某进程有3页,其页号为0、1、2,被分别装入内存的2、4、7,问:
1.  内存地址应使用多少位来表示?进程每一页的长度为多少B?逻辑地址中的页内地址应该用多少位?  逻辑地址应该用多少位?
2.写出该进程每一页在内存的起始地址。
3.逻辑地址5276、或者0A12H(十六进制)对应的物理地址是多少?
内存地址:64k = 2^6 * 2^10 = 2^16用16位表示
进程每一页的长度为64KB / 16 = 4KB;逻辑地址中的页内地址应该用12位表示;逻辑地址应该用14位表示;【因为页号用2位表示,2+12=14位】
0页2 * 4KB, 1页4 * 4KB, 2页7 * 4KB
页号为 5276 / 4k = 5276 / 4096 = 1 , 页内地址为 5276 % 4096 = 1180 物理地址 = 4* 4KB + 1180 ;
0A12h的十进制为2578 。页号: 2578 / 4k = 2578 / 4096 = 0, 页内地址为 2578 % 4096 = 2578 ,物理地址为:2 * 4KB + 2578

1.分段存储管理系统中物理地址的计算(填空题,综合题)
题型:某段表的内容如下:
段号       段首址        段长度
0          120K           40K
1          760K           30K
2          480K           20K
3          370K           20K
一逻辑地址为(2,154B),它对应的物理地址为多少?
可能越界:一种是段长和另一种是段号的越界
480K+154B

Ch5
1.虚拟存储器的定义,基于什么原理提出的(P155填空题、简答题)
虚拟存储器是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。
虚拟存储器是基于离散分配的原理提出的。
1.什么是程序执行时的时间局限性和空间局限性?P154(简答题)
时间局限性:如果程序中的指令被执行,则不久以后该指令可能再次执行;如果某数据被访问过,则不久以后该数据可能再次被访问。
空间局限性:一旦程序访问了某个存储单元,在不久之后,其附近的存储空间也将被访问,即程序在一段时间内所访问的地址可能集中在一定的范围之内,其典型情况便是程序的顺序执行。
1.常见的页面置换算法:最佳页面置换算法OPT、先进先出页面置换算法FIFO、最近最少使用页面置换算法LRU。(填空题、选择题、综合题)
题型:假定某请求页式虚拟系统中,某进程的页面访问为:0,0,3,1,1,4,0,5,6,6,2,4,6,7,7,0,0,6,7,2,进程实际页面数为3,则按先进先出FIFO置换算法和最近最久未使用LRU置换算法,求缺页中断次数和缺页率。
(1)FIFO
Snip20160628_116
缺页中断次数:13;缺页率:产生中断的次数 / 总访问次数 = 13 / 20 =  0.65

(1)LRU
Snip20160628_117
缺页中断次数:12;缺页率:12 / 20 = 0.6
(3)OPT
选择在最长(未来)时间内不再被访问的页面。
缺页次数和缺页率计算如上

Ch6
1.有哪些I/O控制方式,工作方式(填空题、简答题、选择题).
答:采用轮询的可编程I/O方式;采用中断的可编程I/O方式;直接存储器访问方式;I/O通道方式
1.系统的设备分配程序进行独占设备分配的步骤是什么?(P203填空题).
答: 分配设备、分配控制器、分配通道
1.通道又称I/O处理机,用于完成什么之间的信息传输。(填空题、选择题)
答:CPU和设备控制器
1.通道、设备控制器和设备(三者联接位置,即控制关系)。(填空题、选择题)
通道控制设备控制器,设备在设备控制器控制下工作
5. 通道的定义、三种通道类型及其特点(连接的设备类型)(选择题)。
通道的定义:一个独立于CPU的专门的I/O控制的处理机,控制设备与内存直接进行信息交换。
通道类型有:字节多路通道,按字节多路交叉方式工作的通道;
数组选择通道,可以连接多台高速设备,通道的利用率很低;
数组多路通道,将数组选择通道传输速率高和字节多路通道分时并行操作的优点结合。
1.了解常用的缓冲技术的作用(选择题)及类型。
缓冲技术的作用:缓和CPU和I/O设备间速度不匹配的矛盾;
减少对CPU的中断频率,放宽对CPU中断响应时间的限制;
解决数据粒度不匹配的问题;
提高CPU和I/O设备之间的并行性。
缓冲技术的类型有:单缓冲、双缓冲、环形缓冲和缓冲池。
1.Spooling系统的作用、组成(填空题、简答题)P207
Spooling系统技术的作用:缓和CPU与I/O设备之间速度不匹配的矛盾
SPO·OLing系统是对脱机I/O工作方式的模拟,SPOOLing系统是由:
1.磁盘中的(输入井)和(输出井),是对脱机输入输出中的磁盘进行模拟;
2.内存中的(输入缓冲区)和(输出缓冲区),用来缓和CPU与磁盘之间的速度的矛盾;
3.(输入进程)和(输出进程)所构成,是对脱机输入输出中的外围控制机进行模拟。
4.(井管理程序),用于控制作业与磁盘井之间信息的交换。
5.I/O系统管理的对象是什么?(P178)按照各层次及其功能,I/O软件的4层是什么?
I/O系统管理的对象:I/O设备和相应的设备控制器
四个层次:用户层I/O软件、设备独立性软件、设备驱动程序、中断处理程序
1.设备独立性是指什么?在有设备独立性系统中,逻辑设备表的作用是什么?(选择题)设备独立性:应用程序中的所有设备,不局限于使用某个具体的物理设备。
逻辑设备表的作用:实现从逻辑设备名称到物理设备名称的转换。
1.掌握当前磁盘(1)先来先服务(2)最短寻道时间优先(3)电梯算法。(综合题、填空题)
【题型】假定一磁盘有200个柱面,编号为0—199,在完成了磁道125处的请求后,当前正在磁道143处为一个请求服务。若请求队列的先后顺序为
86,147,91,177,94,150,102,175,130
试分别采用FCFS(先来先服务)、SSTF(最短寻道时间优先)、SCAN(扫描)算法完成上述请求,写出磁头移动的顺序,并计算存取臂移动总量(单位为磁道数)。
Snip20160628_118

Ch7
1.文件系统的主要目的、概念(选择题、填空题)
文件系统的主要目的是实现对文件的按名存取
文件系统最基本的目标是 (按名存取),它主要是通过(目录管理)功能实现的,文件系统所追求的最重要目标是 (提高对文件的存取速度)。
按逻辑结构可把文件分为:记录式文件、流式文件
1.文件目录的作用(选择题)

    作用:实现文件名到物理地址的转换。

全国计算机二级C 错题/知识点整理

算法的有穷性是指:算法程序的运行时间是有限的

算法的空间复杂度是指:算法在执行过程中所需要的临时工作单元数
算法的时间复杂度是指:算法在执行过程中所需要的基本运算次数(计算工作量)
算法的时间复杂度和空间复杂度没有直接关系
数据的存储结构是指:数据的逻辑结构在计算机中的表示
有一个以上根结点的数据结构一定是非线性结构
只有一个根结点的数据结构不一定是线性结构,比如树只有一个根结点,但是树不是线性结构
循环链表和双向链表都是线性结构 线性结构的定义是,有且只有一个根结点,且中间每个结点有且仅有一个前驱和后继
线性表即顺序表,数据之间是一对一的关系,除首尾,其他所有的元素都首尾相接
栈 只能在栈顶插入数据
支持子程序调用的数据结构是 栈 因为递归调用子程序的时候就是先入后出的线性结构 符合栈
栈有记忆作用;栈既能顺序存储,又能链式存储
在循环队列中,队头指针可以大于队尾指针,也可以小于队尾指针
循环队列是队列的一种,而队列和栈是一种顺序存储结构。
线性表的链式存储结构所需要的存储空间一般要多于顺序存储结构
二叉树的性质:
在非空二叉树中,第i层结点总数不超过2^(i-1)
深度为h的二叉树最多有2^h-1个结点 最少有h个结点
对于任意一颗二叉树,其叶子结点数N0 = 度数为2的结点总数N2  + 1
具有n个结点的完全二叉树的深度为log2(n+1)
对于完全二叉树 度为1的结点数只有两种可能:0或1
二分查找的最坏情况为log2n次(这是查找这是查找这是查找!)
(以下是排序以下是排序以下是排序!)
冒泡排序、快速排序、直接插入排序在最坏情况下的比较次数是n(n-1)/2
堆排序在最坏情况下比较次数最少,为nlogn
程序既要注重效率又要注重清晰的可读性
结构化程序设计的基本原则(方法):自顶向下、逐步求精、模块化
继承是指类之间共享属性和操作的机制
对象的基本特点:分类性、多态性、标识唯一性
不是任何对象都必须有继承性,对象的多态性是指同一个操作可以是不同对象的行为
面向对象程序设计的特征有 继承性、多态性、封装性 不包括类比性
构成计算机软件的是 程序、数据以及相关文档
软件危机的表现:软件开发的生产率低、软件质量难以控制、软件成本不断提高
软件工程的主要思想是强调在软件开发过程中需要应用工程化原则
软件工程的3个要素:工具、过程、方法
软件工程过程的4个基本活动:软件规格说明、软件开发、软件确认、软件演进
软件生命周期的定义阶段:可行性研究、计划制定、需求分析
软件生命周期的开发阶段:测试、概要设计、详细设计、实现
软件设计的基本原则是 抽象、信息隐藏、模块化、局部化、确定
性、一致性、可验证性
需求分析阶段:需求分析、需求评审、需求获取
需求分析阶段可以使用的工具是:DFD、DD、判断树、判断表
在软件设计中不使用的工具是:程序流程图,使用的工具有:系统结构图、PAD图、数据流图(DFD图)
概要设计->系统结构图
详细设计->程序流程图、N-S、PAD等
数据字典(DD)所定义的对象都包含于数据流图(DFD图),数据字典在需求分析阶段建立。
软件设计中的模块划分应遵循 高内聚、低耦合。
数据流程图中没有控制流、程序流程图中没有数据流。
软件测试的目的是尽可能多的发现错误,而并非改正错误。
检查软件产品是否符合需求定义的过程称为确认测试
黑盒测试方法是边界值分析、白盒测试方法是逻辑覆盖
软件测试实施步骤有:集成测试、确认测试、单元测试
软件调试的任务是 诊断并改正程序中的错误
数据库管理系统是在操作系统支持下的系统软件
数据库应用系统的核心问题是数据库设计
数据库系统的核心是数据库管理系统
数据库管理系统DBMS包含数据库DB和数据库系统DBS
数据库管理系统中负责数据模式定义的语言是数据定义语言
数据库技术的根本目标是解决数据的共享问题
数据库设计是指在已有数据库管理系统的基础上建立数据库
E-R模型(实体-联系模型)
在E-R模型中,用来表示实体联系的图形是菱形,用来表示实体的图形是矩形,用来表现属性的是椭圆。
E-R图设计数据数据库设计的概念设计阶段
用树形结构表示实体之间联系的模型是层次模型
在关系模型中,每一个二维表称为一个关系
在满足实体完整性约束的条件下一个关系中应该有一个或多个候选关键字
在学生管理的关系数据库中,存取一个学生信息的数据单位是记录
负责数据库中查询操作的数据库语言是数据操纵语言(查询、添加、删除)
运算关系中不改变关系表的属性个数但能减少元组个数的是:交
投影:元组数量不变、属性减少
选择:元组数量减少、属性不变
自然连接:提取两个表中相同的内容然后连接起来
两个表之间的运算关系 只能是投影和选择
当对关系R和S进行自然连接时、要求R和S含有一个或多个共有的属性
在数据库设计中,将E-R图转换成关系数据模型的过程属于逻辑设计阶段
将E-R图转换为关系模式时、实体和联系都可以表示为关系
数据库设计的四个阶段是:需求分析、概念设计、逻辑设计和物理设计
一个C语言程序可以实现多种算法
C语言源程序可以放在不同的文件中,同一个源程序也可以放在不同的文件中
算法正确的程序可以有零个输入,但不能有零个输出
每一个C语言的文件或者函数都可以单独编译,但只有main函数才可以执行
sizeof(int) = 4 || sizeof(double) = 8
C语言函数可以嵌套调用,但是不是所有的函数之间都可以相互调用,比如说不可以调用main函数
规定 C程序中 不能在函数的内部定义函数
块状注释不能嵌套使用
C语句与机器指令不是一一对应关系
我们所写的每条C语句,经过编译最终都将转换成二进制的机器指令
115L可以用作数据常量,L表示长整型
在C语言中没有定义逻辑类型,而是用0表示假,非零表示真
case是系统关键字,不能用作用户自定义标识符
常量中 在前面加0表示八进制 不能出现8和以上的数字 在前面加0x表示十六进制 前面不会出现o这个字母的
在转义字符中,\后面只能0~127 表示ASCII码(即八进制中的0~177)
符号常量是指在程序中通过宏定义用一个符号名来代表一个常量
标识符的长度不能任意长,最多只能包含32个字符
E/e前后都必须要有数字,且后面必须为整数
整型数据10,000 这样的表示形式是错误的
单引号里面的字符串有ASCII码和转义字符两种,ASCII必须为八进制或者十六进制 即\ddd或者\xhh
x/y 若左右两边都为int型 那么运算结果也是int型
double类型不能进行取余操作
&&表示逻辑与
C语言本身没有提供输入输出语句,但是可以通过调用标准库函数中提供的输入和输出函数来实现输入和输出
C语言中的注释可以出现在程序中的任何位置,但是不能夹在变量或者关键字之间
C语言的变量在函数开始位置进行定义,也可以在变量使用前位置定义
一个浮点数可以和一个整数相加,运算符两侧的运算类型也可以不一致
数值常量中不允许夹带空格
sizeof为测试内存的运算符,()为算数运算符,&&为逻辑运算符,<>不是运算符
强制转换类型表达式格式为(类型名)(表达式),两个括号都不能省略
关系运算符两边的运算对象可以是C语言中任意合法的表达式
在C语言中,逻辑真值为任何非零数(!!),逻辑假值为0
赋值表达式左边必须为变量,不能是常量!!
逻辑表达式的运算比较复杂,有短路现象
“逻辑与”和“逻辑或”运算低于关系运算和算术运算,但是“逻辑非”却高于算术运算
采用printf输出数据,输出数据都默认为右对齐,若要左对齐,可以在格式控制的”%”和宽度之间加一个”-“来实现
printf的输出精度由变量的类型决定,与域宽无关
赋值语句是一种执行语句,必须放在函数的可执行部分
由printf输出的数据都隐含右对齐!!
%8.6f的意思是 一共连着小数点占8位,小数点后面留6位数字
在printf语句中用%%输出一个%符号
负数取余后结果为负数:先按照正数时候情况算,然后加上负号
scanf语句中中间无间隔符,可以空格或者tab或者回车隔开 不能用逗号隔开 中间有逗号那必须用逗号隔开输入
double型数据scanf中要%lf格式
当scanf从键盘输入数据时,按下回车键后,scanf即接受了这一行数据,不能修改
分支结构是根据表达式的结果来判断流程走向的,不一定是算数表达式
关系运算符的结果只有两种,0和1
在scanf函数中的格式控制字符串是为了输入数据用的,不会输出到屏幕上
复合语句也可以是空语句,并没有规定语句条数
在scanf函数的格式字符前可以加入一个正整数指定输入数据所占的宽度,但不可以用实数制定小数位的宽度
scanf(“格式字符串”,输入项首地址列表) 对于double型,输入时要输入l修饰,否则会产生错误的输入信息,同时输入项必须为地址,也可以是保存变量地址的指针变量。
if(表达式) 表达式可以是任意合法的数值
看清if语句里面为赋值还是为== 赋值语句 只要非零就为真 赋值为0就是假
case后面只能跟常量表达式,不能跟变量表达式
在switch语句中并不是必须有break和default语句,可以根据需要安排是否有这两个语句
default后面看有没有break;如果没有break;那么后面的case还是要执行的
if(表达式);傻逼空语句= =
switch后面如果是表达式,那么要加括号。case后面必须要有一个空格。case后面也可以是表达式 不一定非要数字
while语句 条件表达式的执行次数总是比循环体的执行次数多一次
do……while语句 条件表达式的执行次数和循环体的执行次数一样
while(y—);每次变量y的值减1,直到等于0退出循环
continue是终止本次循环(但还继续下一轮循环),break是跳出当前循环体,后面的不执行了,只执行到这一步
if(i == 3)
continue:0,1,2,4,5
break:0,1,2
!0 为 1 非任何非零数的结果为0  如!2 为 0
for(i = 0;i < 8;i++){ }  执行完for循环体后 最后一步i++还是要执行的
只要适当地修改代码,就可以将do-while和while相互转换
break语句!!只能用在循环体内和switch语句内
当break出现在循环体中的switch语句体内时,只是跳出switch,而不终止循环体执行
函数可以在主函数体内进行声明然后进行调用
若调用子函数的主函数在子函数之前,那么前面必须有子函数的定义,子函数必须先定义后使用
各函数间没有主从关系,不能嵌套定义函数
strlen(s)计算字符串长度不包括末尾的结束标志符’\0’
strcmp(str1,str2) 若str1 == str2 那么函数值为0 若str1 > str2函数值是一个正数 若str1 < str2 函数值是一个负数
\n \t \\这些都是转义字符,只要一个字节长度
函数名代表该函数的入口地址
一个自定义函数中可以根据不同情况设置多条return语句
int fun(int *p) {return *p;} fun函数返回值是一个整数,因为返回的是整型指针变量p所指向的数据
无论有多少个return语句,return只能执行一次,返回一个函数值
若函数有返回值,必须通过return语句返回
C程序必须由一个或一个以上的函数组成
( )的优先级高于*
static 在函数定义的静态变量,只需赋值1次,即可保存初始值,不需要每次调用时都赋初始值
函数的形参和实参分别占用不同的存储单元
函数的形式参数属于局部变量
子函数中可以给全局变量赋值,如在头文件下所有函数之外定义int a = 1;  然后 void fun(){a = 3;}这样a的值在调用fun()的时候变成了3
在一个C源程序文件中所定义的全局变量,其作用域由具体定义位置和extern说明来决定范围
子函数中的静态局部变量a和主函数中定义的一个a是没有任何关系的
C语言中形式参数组是指针变量,其数组中元素的个数由传递的实参数组决定,因此可以在定义的时候,不给出元素个数的具体说明
在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,也就是全局变量。全局变量可以为源文件中其他函数所公用,其作用域为从定义变量的位置开始到源文件结束。因此只要用户定义的标识符,全部都有作用域。局部变量可以说明为auto、register以及static。
动态变量auto存储在内存中的动态存储区,在程序运行中,只有当调用变量所在的函数时,系统才临时给变量分配存储单元,全局变量extern一经定义,系统为其分配固定的内存单元;静态变量static编译系统为其分配固定的存储空间;寄存器变量register不保存在内存上,而是直接存储在CPU的寄存器中。
所以说在C语言中,只有在使用时才占用内存单元的变量,其存储类型是auto和register。
在C语言中,有两种对文件的存储方式:顺序存取和直接存取。
如果以“a”的方式对一个已打开的文件进行写操作后,则原有文件中内容将保存,新的数据写在原有内容之后。
如果以“a+”的方式为读和写而打开一个文件,则既可以对文件进行读,也可以对文件进行写,而且在读和写操作之间不必关闭文件,可以从头开始读。
当对文件的读(写)操作完成之后,必须将它关闭。
文件指针实际上是指向一个结构体类型的指针,这个结构体中包含如缓冲区的地址、在缓冲区中当前存取的字符的位置、对文件是“读”或“写”、是否出错、是否已经遇到文件结束标志等信息。
一般称文件指针结构体类型名为FILE,可以用此类型名来定义文件指针。所以说 文件指针是程序中用FILE定义的指针变量
文件由数据序列构成,可以工程二进制文件或文本文件
调用函数rewind把文件内部的位置指针重新指向一个文件的开头
fread(buffer,size,count,fp);  buffer是数据块指针,对fread来说,它是内存块的首地址,输入的数据存入此内存块中
gets和getchar函数用于从标准输入设备终端读入字符串和字符,并非从磁盘文件读入,fputs用于把字符串输出到文件,fwrite用于以二进制形式输出数据到文件。
fp = (filename,”rb+”);
fwrite的调用形式为:int fwrite(char *pt,unsigned size,unsigned n,FILE *fp); 其功能是把pt所指向的n*size个字节输出到fp所指文件中。
ANSIC提供的feof函数的功能是判断fp所指的文件的位置是否已达到文件尾,如果达到文件尾,则feof函数的值为1,否则为0,表示文件尚未结束。
fputc()是以字符(字节)为单位的读写函数。每次可从文件读出或向文件写入一个字符。使用格式为fputc(ch,fp);
EOF是stdio.h库函数文件中定义的符号常量,其值等于-1.EOF用作文件结束标志(!!!)。在二进制或者文本文件内部有一个位置指针,用以指示文件内部的当前读写位置。使用fgetc函数,每读写一次,该指针均向后移动。
每个数组包含一组具有同一类型的变量,这些变量在内存中占有连续的存储单元
语句float a[10],x; a = &x;是非法的,a表示首地址,在程序中为常量不可更改
二维数组的初始化时,允许省略行下标,不允许省略列下标
在逻辑上,可以把二维数组看成是一个具有行和列的表格或矩阵
int x[2][3]; 数组x可以看作是由x[0]和x[1]两个元素组成的一维数组;元素x[0]可看作是由3个整型元素组成的一维数组;x[0]和x[1]是数组名,分别代表一个地址常量
在定义一维数组时,数组的下标应该是一个确定的整数值。要注意的是在定义二维数组时,其第一维下标可以省略,但第二维下标不能省略。
不可以int n = 5; a[n];在C语言中,定义以为数组中n不可以是变量,必须是整型常量表达式。
char ss[][20] = {“right?”} 这样的赋值是错误的,定义二维数组后,字符串的存储不能通过赋值,只能通过初始化或输入得到
不可以对字符串进行关系运算
两个连续的双引号(“”)是合法的字符串常量
char s[5] = {‘a’,’b’,’c’,’d’,’e’}; 是错误的 字符串结束标志无法存储
char *s;gets(s); 是错误的 要先对指针变量初始化
C语言中没有字符串数据存储类型
字符串数组,是指数组中的每个元素都是一个存放字符串的一维数组
C语言本身没有提供对字符串进行整体操作的运算符
sizeof是实际占用内存,strlen是实际字符个数
字符数组不能直接赋值
字符数组仅仅可以采用定义时初始化以及输入得到数据,在程序其他部分不允许对其进行赋值。字符串常量中除了实际字符之外还有结束标志,没有字符串结束标志的运行是不安全的
gets(s)函数的作用是将输入的字符读入字符串s,直到遇到回车。而scanf()函数接收字符串时的结束标志为回车或者空格。
char *s; s = “hello”;是正确的 而 char *s;s = {“hello”};是错误的 定义指针变量s,通过赋值语句保存字符串常量的地址是可以的,而字符数组决不能赋值,而只能初始化或者输入。
s[] = “abcde”; s += 2; 因为s表示的是一个地址常量,常量是不可以被赋值的,所以这句话是错的,程序会出错
预处理命令可以放在程序的任何位置,其有效范围是从定义开始到文件结束。预处理命令有宏定义、文件包含和条件编译三类。
预处理语句后面不能加分号!!
宏定义仅仅只是符号替换,不是赋值语句,因此不做语法检查;双引号中出现的宏名不替换;使用宏定义可以嵌套,即后定义的宏中可以使用先定义的宏。
预处理命令行是在系统对源程序进行编译之前处理的,不是在程序执行的过程中
在C语言中,凡是以“#”开头的行,都称为“编译预处理”。
包含头文件的#include 命令行是通常书写在所用源程序文件的开头,故有时也把包含文件称为头文件。头文件名可以由用户指定,其后缀不一定用“.h”
当包含文件修改后,对包含该文件的源程序必须重新进行编译连接
a = b = (int *)malloc(sizeof(int));含义为 申请了一个整型的存储空间,让指针a,b,c分别指向它,*a = 1; *b = 2; *c = 3;语句的含义为所申请的整型存储空间的内容,*c = 3; 最后执行导致存储空间的内容为3.
ANSIC标准规定calloc函数返回值的类型为void*。具体使用格式为:calloc(n,size)。该函数用来给n个同一类型的数据项分配连续的存储空间,每个数据项的长度为size个字节。若分配成功,函数返回存储空间的首地址;否则返回空。通过调用calloc函数所分配的存储单元,系统自动置初值0。
指针变量赋地址值的方式有3种方式:通过求地址运算符(&);通过指针变量获得地址值;通过标准函数获得地址值。
NULL是stdio.h头文件中定义的预定义符。NULL的代码值为0.可以给指针变量赋NULL值。例如p = NULL;赋值语句,称p为空指针。这条语句等价于p = ‘\0’;或者p = 0;这时,指针p并不是指向地址为0的存储单元,而是具有一个确定的值——“空”。
在C语言中,二维数组名也是一个存放地址常量的指针,其值为二维数组中第一行的地址。
int x = 0,*p; p = NULL;
float x; float *p = &x;
*(s + 3)表示的是引用数组a[3].