C程序设计基础_第1页
C程序设计基础_第2页
C程序设计基础_第3页
C程序设计基础_第4页
C程序设计基础_第5页
已阅读5页,还剩191页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章引论1.1计算机语言1.2语言和实现语言的工具1.3C语言简介1.4一个简单的C程序1.5程序开发过程1.6解决问题与程序设计1.7TurboC上机步骤1.1计算机语言程序是用计算机语言写成的。编程的实质就是用计算机语言来表达要解决的问题的逻辑。用计算机高级语言写成的代码被语言的实现工具(TurboC,VC,VB,Delphi或C++Builder)转换成计算机的最低级机器语言,这就完成了人与机器在程序制定上的最后沟通。可见,你的思路是先用人类自己的语言思考,然后用一门计算机语言写成代码,最终需要一个语言工具来将它转换成机器可以理解的机器语言。我们要学的就是一门承上启下的计算机语言。这样语言有很多:BASICPascalC,C++,Java,C#,我们学的C语言是使用最多的语言。有关C语言的更多特点,将在以后的章节谈到。返回1.2语言和实现语言的工具1.2.1机器语言计算机的机器语言是由这些0和1组成的。事实上,计算机单的所有数据,无论是一个程序、一篇文稿、一张照片还是一首MP3,最终都是0和11.2.2汇编语言汇编语言仅是机器语言的一种助记符,两者之间没有本质的区别,所以很多时候人们把两者等同视之。1.2.3高级语言汇编语言和机器语言虽然很难记难写,但它们的代码效率高、占用内存少,这相当符合当时计算机的存储器昂贵、处理器功能有限等硬件特点。返回下一页1.2语言和实现语言的工具一门计算机语言“越符合机器的特点,同时也就越不符合人类的特点”。最早有Pascal,C,C++,BASIC等数白种高级语言,现在又有Java,C#等。高级语言的高级之处在于它总是尽量接近人类的自然语言和思维方式。1.2.4语言实现工其无论是在写代码的过程,还是最后要编译成可执行文件,都需要有一个工具存在。这一工具一般称为编程集成环境(IDE)。之所以称为集成,是因为从写代码到最后软件的出炉,我们需要它的地方实在太多了。下面列出其中最重要的功能项。返回下一页上一页1.2语言和实现语言的工具(1)方便的代码编辑功能(2)程序编译这功能(3)程序调试功能(4)其他辅助功能返回上一页1.3C语言简介C语言是贝尔实验室DennisRitchie在1973年设计的一种程序设计语言,其目的是用来写操作系统和系统程序,初期用在PDP-11计算机上写UNIX操作系统。1.3.1C语言的特点c语言之所以能被世界计算机界广泛接受是由于其自身的特点。C语言的主要特点包括以下几点。C语言比较简单,是一个比较小的语言。C语言提供了丰富的程序机制,包括各种控制机制和数据定义机制,能满足构造复杂程序时的各种需要。返回下一页1.3C语言简介C语言提供了一套预处理命令,支持程序或软件系统的分块开发。C语言的另一特点是可以写出效率很高的程序。C语言的设计得到世界计算机界的广泛赞许。1.3.2C语言的发展和标准化随着C语言应用的发展,人们更强烈地希望C语言能成为一种更安全可靠、不依赖于具体计算机和操作系统(如UNIX)的标准程序设计语言。美国国家标准局(ANSI)在20世纪80年代建立了专门的小组研究C语言标准化问题,这项工作的结果是1988年颁布的ANSIC标准。这个标准被国际标准化组织和各国标准化机构所接受,同样也被采纳为中国国家标准。返回上一页1.4一个简单的C程序1.4.1C程序的加工和执行C语言是高级程序语言,用C语言写出的程序通常称作源程序。C程序人容易使用、书写和阅读,但计算机却不能直接执行,因为计算机只能识别和执行特定一进制形式的机器语言程序。为使计算机能完成某个C源程序所描述的工作,就必须首先把这个源程序转换成一进制形式的机器语言程序,这种转换由C语言系统完成。由源程序到机器语言程序的转换过程称为“C程序的加工”。每个C语言系统都具有加工C源程序的功能,包括“编译程序”、“连接程序”等,系统单还可能有一些其他的程序或功能模块。返回下一页1.4一个简单的C程序1.4.2程序格式实际的C程序可能比前面的简单例了长得多。一般来说,一个C程序是由一系列可打印(可显示)字符构成的,人们一般用普通编辑器或者用专门的程序开发系统写程序、修改程序。组成程序的字符序列通常按照人阅读的习惯被分为一些行(就是在字符序列中插进一些换行符),每行长度不必相同。注意,上面把花括号内的部分看做下一层次内容后退几格写出,就是希望程序的表面形式能较好反映程序的内部层次结构。返回上一页1.5程序开发过程1.5.1程序的开发过程用计算机解决问题的过程可以用图1-1描述,这种过程大致如下。(1)分析问题,设计一种解决问题的途径。(2)根据所设想的解决方案,用编辑系统(或IDE)建立程序(3)用编译程序对源程序进行编译(4)反复工作直到编译能正确完成(5)正常连接产生了可执行程序后,就可以开始程序的调试执行了。返回下一页1.5程序开发过程1.5.2程序错误所谓排除程序错误,也就是排除自己在程序设计过程中所犯的错误,或说是改正自己写在程序里的错误。程序的错误可以分为两大类,一类是程序书写形式在某些方面不符合程序语言要求而形成的错误。对于这类错误,语言系统在加工程序的过程中能够检查出来。另一类是程序书写形式本身没错,加工过程能正常完成,产生可执行程序,但或是程序执行中出了问题或是计算结果(或执行效果)不符合需要的错误。排除程序错误的目的就是要消除这两类错误。返回下一页上一页1.5程序开发过程1.5.3程序加工中有关错误的排除如果语言系统在程序加工过程中能查出错误,编译程序或连接程序就会产生出错信息。通常语言处理程序每发现一个错误就产生一个错误信息行,指明发现错误的位置(例如发现错误的源程序行编号等)和所确认的错误类型,信息行单还可能包括其他信息,供人们检查程序时参考编译程序能发现的错误(编译错误)主要有两类。(1)局部语法错误,如缺少必要的符号(C常见的如缺少分号、括号),组合符号拼写不正确等。返回下一页上一页1.5程序开发过程(2)程序单上下文关系方面的错误。连接程序也可能检查出一些错误,这些错误称为连接错误。1.5.4程序运行中的错误完成了程序加工,生成了可执行程序之后,下一步工作应是试验性地运行程序了。检查运行情况,看它是否正确实现了所需功能。程序运行中也可出错,出错情况可能有多种。(1)程序执行中可能违反了系统环境的基本要求,例如试图执行某种非法操作。(2)由于编程错误,致使程序在执行中进入某种不能结束的状态,一般称“进入死循环”,也就是无体止地重复执行某段指令而无法停止。返回下一页上一页1.5程序开发过程(3)程序在执行中因为出现某些情况无法继续下去而停止,这时会给出运行中的动态错误信息。(4)还有一种情况:程序能执行到结束,并不出错,但是产生的结果却不合要求或者不确。返回返回下一页上一页1.5程序开发过程1.5.5动态运行错误的排除人们常把程序错误分为两类。一类是静态错误,通过静态检查源程序可以清楚地看到它们。编译程序、连接程序能发现的错误都属于这一类。系统在加工中发现错误给出信息后,比较容易通过检查有关位置的上下文,确定错误原因和改正方法。另一类称为动态运行错误,出现在程序执行中,确认和纠正,都更困难。仅能从程序代码、数据情况与得到的结果去设法弄清原因,需要更多的分析和思考。在发现动态运行错误后,首先还是应该分析错误的现象和程序代码,考虑出现错误的可能性,逐步排除疑点。返回下一页上一页1.5程序开发过程C语言系统通常都为程序的动态检查提供了支持。尤其是各种集成式开发环境,它们都为程序的动态检查提供了强有力的支持。这方面的功能通常包括追踪、监视、设置断点、中断执行等,在以调试方式执行程序时可以使用这些功能,这单做些简单介绍。返回上一页1.6解决问题与程序设计本课程涉及的东西很多,包括知识的记忆和灵活掌握,解决问题的思维方法,具体处理的手段和技巧,还有许多实际工作和操作技能问题。我们把几个重要方面列在这里(1)分析问题的能力,特别是从计算和程序的角度分析问题的能力。(2)掌握所用的程序语言,熟悉语言中的各种结构,包括其形式和意义。(3)学会写程序。(4)检查程序错误的能力。返回下一页返回下一页1.7TurboC上机步骤1.调用TurboC程序如果用户的当前目录是TurboC编译程序所在的子目录(例如TC子目录),只击从键盘键入“tc”命令即可。用户可以通过以上菜单项来选择使用TurboC集成环境所提供的各项主要功能。2.编辑源文件在编辑(Edit)状态下可以根据需要输入或修改源程序。返回下一页上一页1.7TurboC上机步骤3.编译源程序选择“Compile”菜单并在其下拉菜单中选择“CompiletoOBJ”,则进行编译,得到一个后缀为.obj的目标程序4.执行程序按F10键,在窗口上部的主菜单中某一项处出现“反相”显示(黑色亮块)。将亮块移到“Run”,按回车键,在其下拉菜单中选择“Run”项;或直接按组合键Ctrl+F9,系统就会执行己编译好的可执行文件。5.退出TurboC集成环境可以按Alt+X组合键退出TurboC,回到DOS命令状态。返回上一页图1-1计算机解决问题过程返回第2章数据类型和运算2.1基本字符、标识符和关键字2.2数据与类型2.3常量与变量2.4基本类型与数据表示2.5运算符、表达式与计算2.6数学函数库及其使用2.1基本字符、标识符和关键字2.1.1基本字符一个C程序就是C语言基本字符组成的一个符合规定形式的序列。C语言基本字符包括:(1)数字字符(2)大小写英文字母(3)其他一些可打印(可以显示)的字符(4)还有一些特殊字符返回下一页2.1基本字符、标识符和关键字2.1.2标识符程序中有许多需要命名的对象。例如,程序中常常需要定义一些东西,以便在各处使用。为了在定义和使用之间建立联系,表示不同位置用的是同一个对象,基本的方式就是为程序对象命名,通过名字建立起定义与使用间、同一对象的不同使用间的联系。为了这种需要,C语言规定了名字的书写形式。程序中的名字称为标识符。一个标识符是字母和数字字符组成的一个连续序列,其中不能有空白字符,而且要求第一个字符必须是字母。为了方便起见,C语言特别规定将下画线字符“_”也当做字母看待。返回下一页上一页2.1基本字符、标识符和关键字2.1.3关键字C语言的合法标识符中有一个特殊的小集合,其中的标识符称为关键字。作为关键字的标识符在程序单具有语言预先定义好的特殊意义,因此不能用于其他目的,不能作为普通的名字使用。除了不能使用关键字之外,我们写程序时几乎可以用任何标识符为自己所定义的东西命名,所用的名字可以自由选择。返回上一页2.2数据与类型数据是程序处理的对象。C语言把程序能处理的基本数据对象分成一些集合。属于同一集合的数据对象具有同样性质:采用统一的书写形式,在具体实现中采用同样的编码方式(按同样规则对应到内部一进制编码,采用同样一进制编码位数),对它们能做同样操作,等等。语言中具有这样性质的一个数据集合称为一个类型。在C语言中,数据类型可分为:基本数据类型、构造数据类型、指针类型、空类型4大类。C语言中数据的基本类型包括字符类型、整数类型、实数类型等。返回2.3常量与变量2.3.1常量和符号常量在程序执行过程中,其值不发生改变的量称为常量。直接常量(字面常量)字符串常量(字符串)符号常量,即用标识符代表一个常量。符号常量在使用之前必须先定义,其一般形式为:#define标识符常量返回下一页2.3常量与变量2.3.2变量其值可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定的存储单元。变量定义必须放在变量使用之前,一般放在函数体的开头部分。要区分变量名和变量值是两个不同的概念。返回上一页2.4基本类型与数据表示2.4.1整数类型和整数的表示C语言提供了多个整数类型以适应不同需要。不同整数类型间的差异在于它们可能具有不同的一进制编码位数,因此表示范围可能不同。程序中用的最多是一般整数类型(今后简称为“整数类型”或“整型”)和长整数类型(简称“长整型”)。整数类型的类型名是int;长整型的类型名为longint.可简写为long。int和long都是关键字。1.整数表示整数(int类型的常量)有几种书写形式,程序中的整数一般采用十进制写法。返回下一页2.4基本类型与数据表示2.表示范围C语言没有规定各种整数类型的表示范围,也就是说,没有规定各种整数的一进制编码长度。3.整数的八进制书写法和十六进制书写法整数与长整数都可以采用八进制或十六进制的形式书写。用八进制形式写出的整数(int类型的常量)是由数字0开始的连续数字序列整数的十六进制形式是由ox或OX开头的数字序列。返回下一页上一页2.4基本类型与数据表示4.整型变量整型变量可以分为以下几种类型。基本整型:类型说明符为int,在内存中占2个字节。短整型:类型说明符为shortint或short所占字节和取值范围均与基本型相同。长整型:类型说明符为longint或long,在内存中占4个字节。注意:要用某计算机上的某个C语言系统编程时,要做的一件事就是查清该系统单各种整数类型的表示范围。返回下一页上一页2.4基本类型与数据表示5.整型变量的定义变量定义的一般形式为:类型说明符,变量名标识符,变量名标识符…;在书写变量定义时,应注意以下几点。(1)允许在一个类型说明符后定义多个相同类型的变量。(2最后一个变量名之后必须以“;”号结尾。(3)变量定义必须放在变量使用之前,一般放在函数体的开头部分。返回下一页上一页2.4基本类型与数据表示2.4.2实数类型和实数的表示1.实数类型C语言提供了3个表示实数的类型:单精度浮点数类型,简称浮点类型,类型名为float;双精度浮点数类型,简称双精度类型,类型名为double;长双精度类型,类型名为longdouble2.实型常量的写法C语言中最基本的实数类型是双精度类型。双精度数的书写形式中的基本部分是一个数字序列,在序列中或者包含了一个表示小数点的圆点“.”(可以是第一个或最后一个字符),或者在表示数值的数字序列后面有一个指数部分。返回下一页上一页2.4基本类型与数据表示3.实型数据在内存中的存放形式实型数据一般占4个字节(32位)的内存空间,按指数形式存储。4.实型变量的分类实型变量分为单精度(float型)、双精度(double型)和长双精度(longdouble型)3类。5.实型数据的舍入误差由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的返回下一页上一页2.4基本类型与数据表示2.4.3字符类型和字符的表示1.字符字符类型数据主要用于程序的输入输出。最常用的字符类型的类型名是chat字符文字量的书写形式是用单引号括起的单个字符,例如’1','a','D,等。这单需要强调两点。(1)字符数据与标识符不同。(2)数字字符和数不同。返回下一页上一页2.4基本类型与数据表示2.字符变量字符变量用来存储字符常量,即单个字符。字符变量的类型说明符是char。字符变量类型定义的格式和书写规则都与整型变量相同。3.字符数据在内存中的存储形式及使用方法每个字符变量被分配1个字节的内存空间,因此只能存放1个字符。4.字符串字符串是C程序单可以直接写出来的另一类数据,其形式是用双引号括起来的一系列字符。返回上一页2.5运算符、表达式与计算了解了基本数据的描述后,就可以讨论计算过程的描述问题了。在C语言程序里,描述计算的最基本结构是表达式,表达式由被计算的对象(例如文字量,后面将会介绍更多的基本计算对象)和表示运算的特殊符号按照一定的规则构造而成。描述数据运算的特殊符号称为运算符,C语言里的运算符大都由一个或两个特殊字符表示(有个别例外)。2.5.1算术运算符常规的算术运算符一共有5个,分别是“+”“-”“*”“/”“%”。返回下一页2.5运算符、表达式与计算2.5.2算术表达式算术表达式由计算对象(例如数值的文字量等)、算术运算符及圆括号构成,其基本形式与数学上的算术表达式类似。2.5.3表达式的求值表达式的计算过程又称表达式求值。表达式的意义就是它所求出的值。1.优先级C语言里有很多运算符,它为每个运算符规定了一个优先级。返回下一页上一页2.5运算符、表达式与计算2.结合方式C语言规定一元算术运算符自右向左结合;一元算术运算符自左向右结合,优先级相同时左边的运算符先计算。3.括号括号能够明确地描述表达式中的计算顺序。4.运算对象的求值顺序虽然有了上述规定,计算过程中仍有些事情没有完全确定。5.各类数值型数据之间的混合运算变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,一种是强制转换。返回下一页上一页2.5运算符、表达式与计算2.5.4自增、自减运算符自增1运算符记为“++”,其功能是使变量的值自增1自减1运算符记为“--”,其功能是使变量值自减1自增1、自减1运算符均为单目运算,都具有右结合性,可有以下几种形式。++jj自增1后再参与其他运算--jj自减1后再参与其他运算j++j参与运算后,j的值再自增1j--j参与运算后,1的值再自减1返回上一页2.6数学函数库及其使用2.6.1函数、函数调用C语言标准库还提供了许多其他函数可供人们在程序单使用。标准库单有一组数学函数,它们可以计算出常用数学函数的函数值。完全不必关心这一函数的功能是通过什么样的计算过程实现的。在表达式中使用函数的一般形式是:函数名(实际参数)函数名(实际参数,实际参数)返回下一页2.6数学函数库及其使用2.6.2数学函数及其使用标准库的每个数学函数都规定了参数个数,规定了所要求的实际参数的类型,都规定了返回值类型。标准数学函数大都要求一个或多个double参数,其返回值也是double类型。注意,C语言标准库的所有函数都采用完全由小写字母拼写的名字,数学函数也不例外,写函数名时必须注意。返回上一页第3章顺序结构和输入/输出的实现3.1C语句概述3.2赋值语句3.3数据输入/输出的概念及在C语言中的实现3.4字符输入与输出3.5格式输入与输出3.6顺序结构程序举例3.1C语句概述C程序的结构如图3-1所示。C程序的执行部分是由语句组成的。程序的功能也是由执行语句实现的。C语句可分为5类:表达式语句、函数调用语句、控制语句、复合语句、空语句。1.表达式语句表达式语句由表达式加上分号“;”组成。2.函数调用语句函数调用语句由函数名、实际参数加上分号“;”组成。返回下一页3.1C语句概述3.控制语句控制语句用于控制程序的流程,以实现程序的各种结构方式。它们由特定的语句定义符组成。4.复合语句把多个语句用括号括起来组成的一个语句称为复合语句。在程序中应把复合语句看成是单条语句,而不是多条语句。5.空语句只有分号“;”的语句称为空语句。返回上一页3.2赋值语句赋值语句是由赋值表达式再加上分号构成的表达式语句。其一般形式为:变量=表达式在赋值语句的使用中需要注意以下几点。(1)由于在赋值符“=”右边的表达式也可以是一个赋值表达式,因此下述形式:变量=(变量=表达式);是成立的,从而形成嵌套的情形。(2)注意在变量说明中给变量赋初值和赋值语句的区别。(3)在变量说明中,不允许连续给多个变量赋初值。(4)注意赋值表达式和赋值语句的区别。返回3.3数据输入/输出的概念及在

C语言中的实现所谓输入/输出是以计算机为卞体而言的。从计算机向外部输出设备(如显示器、打印机、磁盘等)输出数据称为“输出”,从输入设备(如键盘、磁盘、光盘、扫描仪等)向计算机输入数据称为“输入”。在C语言中,所有数据的输入/输出都是由库函数完成的。由于C语言编译系统和函数库是分别进行设计的,因此不同的计算机系统所提供的函数的数量、名字和功能不是完全相同的。在使用C语言库函数时,要用预编译命令#include将有关“头文件”包括到源文件中去。返回3.4字符输入与输出3.4.1putchar函数(字符输出函数)putchar函数是字符输出函数,其功能是在显小器上输出单个字符。其一般形式为:putchar(字符变量)3.4.2getchar函数(字符输入函数)getchaa函数的功能是从键盘上输入一个字符。其一般形式为:Getchar();返回3.5格式输入与输出3.5.1输出格式控制人们把printf看做格式化输出函数的代表,在这单将以它为例,讨论标准库格式化输出函数的格式描述问题。其他格式化输出函数(如fprintf等)在格式描述方面的情况与printf完全相同。因此printf函数调用的一般形式为:printf(“格式控制字符串”,输出表)其中格式控制字符串用于指定输出格式。格式字符串总以%开始,到一个格式字符为止返回下一页3.5格式输入与输出3.5.2输入格式控制scanf是前面程序中反复使用的标准库函数。这单将以它为例,详细介绍标准库格式化输入函数的格式控制问题,其他各种格式化输入函数(如文件输入函数fscanf等)在格式描述方面的规定都与scanf完全一样。函数scanf的原型如下:intscanf(constchar=format,…)可以看到scanf也是一个实参数目可变的函数,它应该有一个字符串形式的格式控制字符串,而后可以根据需要有任意多个其他参数。返回下一页上一页3.5格式输入与输出所以scanf函数调用的一般形式为:scanf(“格式控制字符串”,地址表列)其中,格式控制字符串的作用与printf函数相同,但不能显小非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址,地址是由地址运算符“&’’后跟变量名组成的。在scanf的执行过程中,如果格式控制字符串format用完,或者遇到实际读入数据与format描述不匹配而无法进行转换的情况,或者在执行中出现错误,本次scanf的执行结束。返回下一页上一页3.5格式输入与输出使用scanf函数还必须注意以下几点。(1)scanf函数中没有精度控制,如scanf("%5.2f",&a);是非法的,不能企图用此语句输入小数为两位的实数。(2)scanf中要求给出变量地址,如给出变量名则会出错。如scanf("%d",a);是非法的,应改为scnaf("%d",&a)(3)在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔,则可用空格、TAB或回车作间隔0C语言编译在碰到空格、TAB、回车或非法数据(如对“%d"输入“12A”时,A即为非法数据)时,即认为该数据结束。返回下一页上一页3.5格式输入与输出(4)在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符(5)如果格式控制串中有非格式字符则输入时也要输入该非格式字符。(6)当输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。返回上一页3.6顺序结构程序举例顺序流程就像一条笔直的,没有分义的路,程序执行完第一行,然后第一行、第二行……我们这一节课用两个例子来熟悉什么叫顺序结构程序设计。【例3.7加法计算器的实现:由键盘输入两个数,输出它们的和。先将源程序写下来:main(){intjs1,js2;/*加数1,加数2*/inthe;/*和*/printf(“PleaseInputFirstNumber:”);/*打印信息:清输入加数一*/返回下一页3.6顺序结构程序举例scanf("od",&jsl);/*从键盘输入数据,存入变量jsl*/printf("PleaseInputSecondNumber:”);scanf(”od”,&js2);he=jsl+js2;/*两个数相加,和存入变量he*/printf("od+od=od\n",jsl,js2,he);/*打印输出结果*/}返回下一页上一页3.6顺序结构程序举例这段代码从功能上分,可以分为4个部分。第一部分,两行代码定义了3个变量第一部分为输入部分,用来输入。第二部分为计算部分,用来计算。返回上一页图3-1C语言的程序结构返回第4章选择结构程序设计4.1关系运算符和表达式4.2逻辑运算符和表达式4.3if语句4.4switch语句4.5选择结构程序举例4.1关系运算符和表达式4.1.1关系运算符及其优先次序在C语言中有以下关系运算符:(1)<小于(2)<=小于或等于(3)>大于(4)>=大于或等于(5)==等于(6)!=不等于关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。返回下一页4.1关系运算符和表达式4.1.2关系表达式用关系运算符将两个表达式(可以是算术表达式或关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来的式子,称为关系表达式。关系表达式的一般形式为:表达式关系运算符表达式关系表达式的值是逻辑值,即“真”和“假”,用“1”和“0”表示。返回上一页4.2逻辑运算符和表达式4.2.1逻辑运算符及其优先次序C语言中提供了3种逻辑运算符:(1)&&与运算;(2)||或运算;(3)!非运算。与运算符&&和或运算符“均为双目运算符,具有左结合性。非运算符!为单目运算符,具有右结合性。逻辑运算符和其他运算符优先级的关系可表示如下:!(非)高于&&(与)高于||(或);返回下一页4.2逻辑运算符和表达式4.2.2逻辑运算的值逻辑运算的值也为“真”和“假”两种,用1”和“0”来表示。其求值规则如下所示。(1)与运算&&:参与运算的两个表达式都为真时,结果才为真;否则为假。(2)或运算目:参与运算的两个表达式只要有一个为真,结果就为真;两个量都为假时,结果为假。(3)非运算!:参与运算的量为真结果为假;参与运算的量为假时,结果为真。返回下一页上一页4.2逻辑运算符和表达式4.2.3逻辑表达式逻辑表达式的一般形式为:表达式逻辑运算符表达式实际上,在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,而只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。熟练掌握个复杂的条件C语言的关系运算符和逻辑运算符后,可以巧妙地用一个逻辑表达式来表示返回上一页4.3if语句4.3.1if语句的3种形式1.第一种形式为:if其一般形式为:if(表达式)语句;其语义是:如果表达式的值为真,则执行其后的语句,否则不执行该语句。返回下一页4.3if语句2.第二种形式为:if-else其一般形式为:if(表达式)语句1;else语句2;其语义是:如果表达式的值为真,则执行语句1,否则执行语句2。返回下一页上一页4.3if语句3.第三种形式为:if-else-if前一种形式的if语句一般都用于两个分支的情况。当有多个分支选择时,可采用if-else-if语句,其一般形式为:if(表达式1)语句1;elseif(表达式2)语句2;elseif(表达式3)语句3;返回下一页上一页4.3if语句elseif(表达式m)语句m;else语句n;其语义是:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句,然后跳到整个if语句之外继续执行程序;如果所有表达式的值均为假,则执行语句n,然后继续执行后续程序。返回下一页上一页4.3if语句4.在使用if语句中应注意的问题(1)在3种形式的if语句中,if关键字之后均为表达式。(2)在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。(3)在if语句的3种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用括起来组成一个复合语句。(4)充分认识else的否定作用,尽量使程序简洁。返回下一页上一页4.3if语句4.3.2if语句的嵌套当if语句中的执行语句又是if语句时,则构成了if语句嵌套的情形。其一般形式可表示如下:if(表达式)if语句;或者为:if(表达式)if语句;elseif语句;返回下一页上一页4.3if语句嵌套的if语句可能也是if-else形式,这时将会出现多个if和多个else贡叠的情况,要特别注意if和else的配对问题。4.3.3条件运算符和条件表达式当在条件语句中只执行单个的赋值语句时常使用条件表达式来实现。这样不但使程序简洁,也提高了运行效率。条件运算符为?和:,它是唯一一个三目运算符,即有3个参与运算的量。由条件运算符组成条件表达式的一般形式为:表达式1?表达式2:表达式3返回下一页上一页4.3if语句其求值规则为:如果表达式1的值为真,则以表达式2的值作为条件表达式的值,否则以表达式3的值作为条件表达式的值。条件表达式通常用于赋值语句之中。使用条件表达式时,还应注意以下几点。(1)条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值运算符。(2)条件运算符?和:是一对运算符,不能分开使用。(3)条件运算符的结合方向是自右至左返回上一页4.4switch语句C语言还提供了另一种用于多分支选择的switch语句,其一般形式为:switch(表达式){case常量表达式1:语句1;case常量表达式2:语句2;case常量表达式n:语句n;default:语句n+1}返回下一页4.4switch语句其语义是:计算表达式的值,然后逐个与case后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行该case后的语句,然后不再进行判断,继续执行后面所有语句;如表达式的值与所有case后的常量表达式均不相同,则执行default后的语句。返回上一页4.5选择结构程序举例【例4.14】输入3个整数,要求按由大到小的顺序输出。main(){inta,b,c,t;scanf(”%d%d%d",&a,&b,&C);if(a<b)t=a,a=b,b=t;if(a<c)t=a,a=c,c=t;

返回下一页4.5选择结构程序举例if(b<c)t=b,b=c,c=t;printf(”%d,%d,%d\n”,a,b,c);}【例4.15】输入学生的百分制成绩,要求输出成绩等级’A','B','C','D','E'。90分以上为'A',80~89分为’B',70~79分为’C',60~69分为’D',60分以下为’E'。main(){ints;scanf(”%d”,&s);返回下一页上一页4.5选择结构程序举例switch(s/10){case10:case9:printf("A")break;case8:printf(”B”)break;case7:printf(”C”);break;case6:printf(”D”)breakdefault:printf(”E”)}返回上一页第5章循环结构程序设计5.1while语句5.2do-while语句5.3for语句5.4多重循环结构的实现5.5break和continue语句5.6goto语句以及用goto语句构成循环5.7循环结构程序举例5.1while语句while语句的一般形式为:while(表达式)语句;其中表达式是循环条件,语句为循环体。while语句的语义是:计算表达式的值,当值为真(非0)时,执行循环体语句,并自动返回对循环条件的判断;否则,结束循环。其特点是先判断表达式,后执行语句。使用while语句应注意以下几点。(1)用以实现“当型”循环。(2)while语句中的表达式一般是关系表达式或逻辑表达式,只要表达式的值为真(非0)即可继续循环。返回5.2do-while语句do-while语句的一般形式为:do语句;While(表达式);这个循环与while循环的不同在于:它先执行循环中的语句,然后判断表达式是否为真,如果为真则继续循环;如果为假(直到为假),则终止循环。因此,do-while循环至少要执行一次循环体语句。可以看到:对同一个问题可以用while语句处理,也可以用do-while语句处理。注意:do-while语句的while(表达式)须加“;”。返回5.3for语句在C语言中,for语句使用最为灵活,它完全可以取代while语句和do-while语句。它的一般形式为:For(表达式1;表达式2;表达式3)语句;它的执行过程如下:(1)先求解表达式1;(2)求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句(循环体语句),然后执行下面第(3)步;若其值为假(0),则结束循环,转到第(5)步;(3)求解表达式3;返回下一页5.3for语句(4)转回上面第(2)步继续执行;(5)循环结束,执行for语句下面的一个语句。for语句最简单的应用形式也是最容易理解的形式如下:for(循环控制变量赋初值;循环条件;循环控制变量增量)语句;循环控制变量赋初值总是一个赋值语句,它用来给循环控制变量赋初值;循环条件是一个逻辑表达式,它决定什么时候退出循环;循环控制变量增量定义循环控制变量每循环一次后按什么方式变化。这3个部分之间用“;”分开。返回下一页上一页5.3for语句注意:(1)for循环中的“表达式1(循环控制变量赋初值)”、“表达式2(循环条件)”和“表达式3(循环控制变量增量)”都是可选择项,都可以省略,但“;”不能省略。(2)省略了“表达式1(循环控制变量赋初值)”,表示不对循环控制变量赋初值,但我们应该在循环之前给循环控制变量赋初值。(3)省略了“表达式2(循环条件)”循环体中不做其他处理时便成为死循环。(4)省略了“表达式3(循环控制变量增量)”,则不对循环控制变量进行操作,这时应该在循环体语句中加入修改循环控制变量的语句。返回下一页上一页5.3for语句(5)可以省略“表达式1(循环控制变量赋初值)”和“表达式3(循环控制变量增量)”。(6)3个表达式都可以省略。(7)表达式1可以是设置循环控制变量的初值的赋值表达式,也可以是其他表达式。(8)表达式1和表达式3可以是一个简单表达式也可以是逗号表达式。(9)表达式2一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值非零,就执行循环体语句。返回上一页5.4多重循环结构的实现一个循环内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以再嵌套循环,这就是多层循环。各种编程语言中关于循环嵌套的概念是一样的。3种循环都可以互相嵌套返回5.4break和continue语句5.5.1break语句break语句通常用在循环语句和switch语句中。当break语句用于switch语句中时,可使程序跳出switch而执行switch以后的语句。Break语句在switch语句中的用法已在前面介绍switch语句时的例子中碰到,这单不再举例。当break语句用于do-while,for,while循环语句中时,可使程序终止循环而执行循环后面的语句。通常break语句总是与if语句连在一起,即当满足条件时便跳出循环注意:(1)break语句对if-else语句不起作用。(2)在多层循环中,一个break语句只向外跳一层,即中断本层循环。返回5.5break和continue语句5.5.2continue语句continue语句的作用是跳过循环体中剩余的语句而强行执行下一次循环,即中断本次循环。continue语句只用在for,while,do-while等循环体中,常与if语句一起使用,用来加速循环。返回5.6goto语句以及用goto语句

构成循环goto语句是一种无条件转移语句,与BASIC中的goto语句相似。goto语句的使用格式为:goto语句标号;其中标号是一个有效的标识符,这个标识符加上一个“:”一起出现在函数内某处,执行goto语句后,程序将跳转到该标号处并执行其后的语句。另外标号必须与goto语句同处于一个函数中,但可以不在一个循环层中。通常goto语句与if语句连用,当满足条件时,程序跳到语句标号处运行。goto语句通常不提倡使用,住要是因为它将使程序层次不清目不易读,但在多层嵌套退出时,用goto语句则比较合理。返回5.7循环机构程序举例【例5.14】求100至200间的全部素数。对本例用一个嵌套的for循环即可处理。程序如下:#include<math.h>main(){intm,i,k,n=0;for(m=101;m<=200;m=m+2){k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)break;返回下一页5.7循环机构程序举例if(i>=k+1){printf(”%d”,m);n=n+1;}if(n%10==0)printf(”\n"}printf(”\n");}返回上一页第6章数组6.1一维数组6.2二维数组6.3字符数组6.4数组程序举例6.1一维数组6.1.1一维数组的定义方式一维数组的定义方式为:类型说明符数组名[常量表达式];其中:类型说明符可以是任何一种基本数据类型或构造数据类型。数组名是用户定义的数组标识符。方括号中的常量表达式须为整型,其值表小数组元素的个数,也称为数组的长度。返回下一页6.1一维数组对数组的定义应注意以下几点。(1)数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。(2)数组名的书写规则应符合标识符的书写规定。(3)数组名不能与其他变量名相同。(4)不能在方括号中用变量来表示元素的个数,但是可以用符号常量来表示。(5)允许在同一个类型说明中说明多个数组和多个变量。返回下一页上一页6.1一维数组6.1.2一维数组元素的引用数组元素是组成数组的基本单元。数组元素引用的一般形式为:数组名[下标]其中下标只能为整型常量或整型表达式,如为小数时,将被自动取整。数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量。在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。返回下一页上一页6.1一维数组6.1.3一维数组的初始化给数组赋值的方法除了用赋值语句对数组元素逐个赋值外,还可采用初始化赋值和动态赋值的方法。数组初始化赋值是指在数组定义时给数组元素赋予初值。数组初始化是在编译阶段进行的。这样可以减少运行时间,提高效率。通常也可以在程序执行过程中,对数组作动态赋值。这时可用循环语句配合scanf函数对逐个数组元素赋值。初始化赋值的一般形式为:类型说明符数组名[常量表达式]={值,值,…,值};其中在{}中的各数据值即为各元素的初值,各值之间用逗号间隔。返回下一页上一页6.1一维数组C语言对数组的初始化赋值还有以下几点规定。(1)可以只给部分元素赋初值。(2)只能给元素逐个赋值,不能给数组整体赋值。(3)如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。6.1.4一维数组程序举例【例6.4】用键盘输入10个整数,输出其中的最大值。main(){inti,max,a【10」;printf(”input10numbers:\n");返回下一页上一页6.1一维数组for(1=0;1<10;1++)scanf(”%d”,&a[i]);max=a[0];for(i=1;i<10;i++)if(a[i]>max)max=a[i];printf("maxnum=%d\n",max);返回下一页上一页6.1一维数组例6.4程序中第一个for语句逐个输入10个数到数组a中,然后把a[0]送入max中。在第一个for语句中,a[1]到a[9]逐个与max中的内容比较,若比max的值大,则把该下标变量送入max中,因此max在己比较过的下标变量中总是为最大者。比较结束,输出的max值即为10个整数的最大值。返回上一页6.2二维数组6.2.1二维数组的定义前面介绍的数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。在实际问题中有很多量是一维的或多维的,因此C语言允许构造多维数组。多维数组元素有多个下标,以标识它在数组中的位置,所以也称为多下标变量。本小节只介绍一维数组,多维数组可由一维数组类推而得到。二维数组定义的一般形式是:类型说明符数组名[常量表达式1][常量表达式2];其中常量表达式1表示第一维下标的长度,常量表达式2表示第二维下标的长度。返回下一页6.2二维数组6.2.2二维数组元素的引用一维数组的元素也称为双下标变量,其表示的形式为:数组名[下标][下标]其中下标应为整型常量或整型表达式。数组说明和数组元素在形式中有些相似,但这两者具有完全不同的含义。数组说明的方括号中给出的是某一维的长度;而数组元素中的下标是该元素在数组中的位置标识。数组是一种构造类型的数据。一维数组可以看作是由一维数组嵌套而构成的。返回下一页上一页6.2二维数组6.2.3二维数组的初始化一维数组初始化也是在类型说明时给各下标变量赋以初值。一维数组可按行分段赋值,也可按行连续赋值。对于一维数组初始化赋值还有以下说明。(1)可以只对部分元素赋初值,未赋初值的元素自动取0值。(2)如对全部元素赋初值,则第一维的长度可以省略。返回下一页上一页6.2二维数组6.2.4二维数组程序举例【例6.10】将一个一维数组行和列元素互换,存到另一个一维数组中。程序如下:main(){inta[2][3]={{1,2,3},{4,5,6}}:intb[3][2〕,i,j;printf(”arraya:\n");返回下一页上一页6.2二维数组for(1=0;1<=1;1++){for(J=0;J<=2;J++){printf(”%5d”,a[i][j]);b[j][i]=a[j][i];}printf(”\n“)}printf(”arrayb:\n“)返回下一页上一页6.2二维数组for(1=0;1<=2,1++){for(J=0;J<=1;J++)printf(”%5d”,b[i][J]);printf(”\n”);}}返回上一页6.3字符数组6.3.1字符数组的定义形式与前面介绍的数值数组相同。由于字符型和整型通用,也可以定义为intc[10],但这时每个数组元素占2个字节的内存单元。字符数组也可以是一维或多维数组。6.3.2字符数组的初始化字符数组也允许在定义时作初始化赋值。返回下一页6.3字符数组6.3.3字符数组的引用字符数组与普通的数组引用方法相同。6.3.4字符串和字符串结束标志在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。前面介绍字符串常量时,已说明字符串总是以’\0’作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符’\0’存入数组,并以此作为该字符串是否结束的标志。有了’\0’标志后,就不必再用字符数组的长度来判断字符串的长度了。C语言允许用字符串的方式对数组作初始化赋值。返回下一页上一页6.3字符数组6.3.5字符数组的输人/输出在采用字符串方式后,字符数组的输入/输出将变得简单方便。除了上述用字符串赋初值的办法外,还可用printf函数和scanf函数一次性输出/输入一个字符数组中的字符串,而不必使用循环语句逐个地输入/输出其每个字符。返回下一页上一页6.3字符数组6.3.6字符串处理函数C语言提供了丰富的字符串处理函数,大致可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。使用函数可大大减轻编程的负担。用于输入/输出的字符串函数,在使用前应包含头文件’stdio.h',使用其他字符串函数则应包含头文件”stiing.h"下面介绍几个最常用的字符串函数。1.字符串输出函数puts格式:puts(字符数组名)功能:把字符数组中的字符串输出到显小器,即在屏慕上显小该字符串。返回下一页上一页6.3字符数组2.字符串输入函数gets格式:gets(字符数组名)功能:从标准输入设备键盘上输入一个字符串。本函数得到一个函数值,即为该字符数组的首地址。3.字符串连接函数strcat格式:strcat(字符数组名1,字符数组名2)功能:把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符串1后的字符串结束标志’\0'。本函数返回值是字符数组1的首地址。返回下一页上一页6.3字符数组4.字符串复制函数strcpy格式:strcpy(字符数组名1,字符数组名2)功能:把字符数组2中的字符串复制到字符数组1中,字符串结束标志’\0‘也一同复制。字符数组名2,也可以是一个字符串常量,这时相当于把一个字符串赋予一个字符数组。5.字符串比较函数strcmp格式:strcmp(字符数组名1,字符数组名2)功能:按照ASCII码的顺序比较两个数组中的字符串,并由函数返回值返回比较结果,共有以下几种结果。

返回下一页上一页6.3字符数组(1)字符串1=字符串2,返回值=0(2)字符串1>字符串2,返回值>0(3)字符串1<字符串2,返回值<0本函数也可用于两个字符串常量的比较,或字符数组和字符串常量的比较。6.测字符串长度函数strlen格式:strlen(字符数组名)功能:测字符串的实际长度(不含字符串结束标志’\0')并作为函数的返回值。返回上一页6.4数组程序举例【例6.22】在_维数组a中选出各行最大的元素组成一个一维数组b本题的编程思路是:在数组a的每一行中寻找最大的元素,找到之后把该值赋予数组b相应的元素即可。程序如下:main(){inta[][4]={3,16,87,65,4,32,11,108,10,25,12,27}:intb[3],i,j,t;返回下一页6.4数组程序举例for(1=0;1<=2;1++){t=a[i][0];for(j=1;j<=3;j++)if(a[i][j]>t)t=a[i][j];b[i]=t;}printf(”\narraya:\n");返回下一页上一页6.4数组程序举例for(1=0;1<=2;1++){for(J=0;J<=3;J++)printf(”%5d”,a[i][J]);printf(”\n");}printf(”\narrayb:\n");for(i=0;i<=2;i++)printf(”%5d”,b[i]);printf(”\n");返回上一页第7章指针7.1地址和指针的基本概念7.2变量的指针和指向变量的指针变量7.3数组的指针和指向数组的指针变量7.4字符串的指针和指向字符串的指针变量7.5指针数组和指向指针变量的指针变量7.6有关指针的数据类型和指针运算的小结7.1地址和指针的基本概念在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元,这些在前面己有详细的介绍。为了正确地访问这些内存单元,必须为每个内存单元编号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。因为根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。返回7.2变量的指针和指向变量的

指针变量指针就是地址,变量的指针就是变量的地址,存放地址的变量就是指针变量。因此,存放变量地址的指针变量指向该变量,亦称为该变量的指针。为了表示指针变量和它所指向的变量之间的关系,在程序中用“*”符号表示“指向”,例如,i-pointer代表指针变量,而*i-pointer是i-pointer所指向的变量返回下一页7.2变量的指针和指向变量的

指针变量7.2.1定义一个指针变量对指针变量的定义包括3个内容:(1)指针类型说明,即定义变量为一个指针变量;(2)指针变量名;(3)指针变量所指向的变量的数据类型。其一般形式为:类型说明符*变量名;其中,*是指针类型说明,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。返回下一页上一页7.2变量的指针和指向变量的

指针变量7.2.2指针变量的引用指针变量同普通变量一样,在使用之前不仅要定义说明而目必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。指针变量的赋值只能赋予地址,决不能赋予任何其他数据,否则将引起错误。两个有关的运算符:(1)&:取地址运算符。(2)*:指针运算符或称“间接访问”运算符,访问指针变量所指向的对象;或称引用运算符,引用指针变量所指向的对象。返回下一页上一页7.2变量的指针和指向变量的

指针变量C语言中提供了地址运算符&来计算变量的地址。其一般形式为:&变量名设有指向整型变量的指钊‘变量P,如要把整型变量a的地址赋予P可以有以下两种方式。(1)指针变量初始化的方法。inta;int*p=&a;(2)赋值语句的方法。inta;int*p;p=&a;返回下一页上一页7.2变量的指针和指向变量的

指针变量指针变量和一般变量一样,存放在它们之中的值是可以改变的,也就是说可以改变它们的指向。通过指针访问它所指向的变量是以间接访问的形式进行的,所以比直接访问一个变量要费时间,而目不直观。7.2.3指针变量几个问题的进一步说明指针变量可以进行某些运算,但其运算的种类是有限的。它只能进行赋值运算和部分算术运算及关系运算。返回下一页上一页7.2变量的指针和指向变量的

指针变量(1)指针运算符取地址运算符&:是单目运算符,其结合性为自右至左,其功能是取变量的地址。(2)取内容运算符*:是单目运算符,其结合性为自右至左,用来表示指针变量所指的变量。2.指针变量的运算1)赋值运算指针变量的赋值运算有以下几种形式。(1)指针变量初始化赋值,前面己作介绍。(2)把一个变量、数组、字符串、函数的地址赋予指向相同数据类型的指针变量。返回下一页上一页7.2变量的指针和指向变量的

指针变量(3)把一个指针变量的值赋予指向相同类型变量的另一个指针变量。2)加减算术运算对于指向数组的指钊‘变量,可以加上或减去一个整数n。设pa是指向数组a的指针变量,的数则pa+n,pa-n,pa++,++pa,pa--、--pa运算都是合法的。指针变量加或减一个整数n意义是把指针指向的当前位置(指向某数组元素)向前或向后移动n个位置。返回下一页上一页7.2变量的指针和指向变量的

指针变量3)两个指针变量之间的运算只有指向同一数组的两个指针变量之间才能进行运算,否则运算毫无意义。(1)两指针变量相减:两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。(2)两指针变量进行关系运算:指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的关系。返回上一页7.3数组的指针和指向数组的

指针变量7.3.1指向一维数组的指针变量一个数组是由连续的一块内存单元组成的,数组名就是这块连续内存单元的首地址。一个数组也是由各个数组元素(下标变量)组成的,每个数组元素按其类型不同占有几个连续的内存单元,一个数组元素的首地址是指它所占有的几个内存单元的首地址。定义一个指向数组元素的指针变量的方法,与前面介绍的指向变量的指针变量相同。返回下一页7.3数组的指针和指向数组的

指针变量指针变量说明的一般形式为:类型说明符*指针变量名;其中类型说明符表示所指数组的类型。从一般形式可以看出指向数组的指针变量和指向普通变量的指针变量的说明是相同的。C语言规定:如果指针变量p己指向数组中的一个元素,则p+1指向同一数组中的下一个元素引用一个数组元索可以用:(1)下标法(2)指针法返回下一页上一页7.3数组的指针和指向数组的

指针变量7.3.2指向多维数组的指针变量1.二维数组的地址设有整型二维数组a[3][4],设数组a的首地址为1000前面己经介绍过,C语言允许把一个一维数组分解为多个一维数组来处理。因此数组a可分解为3个一维数组,即a[0],a[1],a[2],每一个一维数组又含有4个元素。数组及数组元素的地址表示如下:从一维数组的角度来看,a是一维数组名,a代表整个一维数组的首地址,也是一维数组0行的首地址,等于1000;a+1代表1行的首地址,等于1008返回下一页上一页7.3数组的指针和指向数组的

指针变量a[0]是第一个一维数组的数组名和首地址,因此也为1000同理,a+1是一维数组行的首地址,等于1008由此得出:a+i,a[i],*(a+i),&a[i][0]是等同的。2.指向二维数组的指针变量设P为指向一维数组a[m][n]的指针变量,P可以指向a的某个元素、首地址或某个一维数组。1)指向二维数组某个元素的指针变量2)指向二维数组首地址的指针变量返回下一页上一页7.3数组的指针和指向数组的

指针变量3)指向二维数组第一个一维数组的指针变量指向一维数组,第一个一维数组的指针变量定义为:int(*P)[n];它表示p是一个指针变量,它指向包含n个元素的一维数组,其值等于a,a[0]或&a[0][0]而p+i则指向一维数组a[i]。返回上一页7.4字符串的指针和指向字符串的指针变量7.4.1字符串的表示形式在C语言中,可以用两种方法访问一个字符串。(1)用字符数组存放一个字符串,然后输出该字符串。(2)用字符串指针指向一个字符串。字符串指针变量的说明与指向字符变量的指针变量说明是相同的。只能根据对指针变量的赋值不同来区别。对指向字符变量的指针变量应赋予该字符变量的地址。返回下一页7.4字符串的指针和指向字符串的指针变量7.4.2使用字符串指针变量与字符数组的区别用字符数组和字符指针变量都可实现字符串的存储和运算,但是两者是有区别的。在使用时应注意以下几个问题。(1)字符串指针变量本身是一个变量,用于存放字符串的首地址。(2)对字符串指针方式返回上一页7.5指针数组和指向指针变量的

指针变量7.5.1指针数组的概念一个数组的元素值为指针则这个数组就是指针数组。指针数组是一组有序的指针的集合。指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。指针数组说明的一般形式为:类型说明符*数组名[数组长度];其中类型说明符为指针值所指向的变量的类型。返回下一页7.5指针数组和指向指针变量的

指针变量应该注意指针数组和指向一维数组的指针变量的区别。这两者虽然都可用来表示一维数组,但是其表示方法和意义是不同的。指向一维数组的指针变量是单个的变量,其一般形式“(,指针变量名)”两边的括号不可少。而指针数组表示的是多个指针(一组有序指针),在一般形式“,指针数组名”的两边不能有括号。指针数组常用来表示一组字符串,这时指针数组的每个元素被赋予所指向字符串的首地址。返回下一页上一页7.5指针数组和指向指针变量的

指针变量7.5.2指向指针变量的指针变量如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针变量的指针变量,亦称二级指针。在前面己经介绍过,通过指向变量的指针变量访问变量称为间接访问。由于指针变量直接指向变量,所以称为“单级间址”。而如果通过指向指针变量(指向变量)的指针变量来访问变量则构成了“二级间址”返回上一页7.6有关指针的数据类型和

指针运算的小结7.6.1有关指针的数据类型的小结有关指针的数据类型见表7-1所示。7.6.2指针运算的小结现把全部指针运算罗列如下所示。(1)指针变量加(减)一个整数。(2)指针变量赋值:将一个变量的地址赋给一个指针变量。(3)指针变量可以有空值,即该指针变量不指向任何变量返回下一页7.6有关指针的数据类型和

指针运算的小结(4)两个指针变量可以相减(5)两个指针变量比较7.6.3void指针类型ANSI新标准增加了一种“void”指针类型,即可以定义一个指针变量,但不指定它是指向哪一种类型数据。返回上一页表7-1指针的数据类型小结返回第8章函数8.1C函数概述8.2函数定义的一般形式8.3函数的参数和函数的值8.4函数的调用8.5函数的嵌套调用8.6函数的递归调用第8章函数8.7函数的指针和指向函数的指针变量8.8返回指针值的函数8.9局部变量和全局变量8.10函数间的数据传递8.11有参主函数和有参宏8.12变量的存储类型8.1C函数概述在前面己经介绍过,C语言源程序是由函数组成的。虽然在前面各章的程序中大都只有一个主函数main(),但实用程序往往由多个函数组成。函数是C语言源程序的基本模块,通过对函数模块的调用实现特定的功能。C语言中的函数相当于其他高级语言的子程序。在C语言中可从不同的角度对函数进行分类。从函数定义的角度看,函数可分为库函数和用户定义函数两种。返回下一页8.1C函数概述C语言的函数兼有其他语言中的函数和过程两种功能。从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。从主调函数和被调函数之间数据传送的角度看函数又可分为无参函数和有参函数两种。C语言提供了极为丰富的库函数,这些库函数又可从功能的角度可以分为多种分类。返回上一页8.2函数定义的一般形式8.2.1无参函数的定义形式无参函数的定义形式如下:类型标识符函数名(){声明部分语句}其中类型标识符(类型说明符)和函数名称为函数头。类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的类型。该类型标识符与前面介绍的各种说明符相同。返回下一页8.2函数定义的一般形式{}中的内容称为函数体。在函数体中的声明部分,是对函数体内部所用到的变量、数组、函数等的说明。在很多情况下都不要求无参函数有返回值,此时函数的类型标识符可以写为void8.2.2有参函数定义的一般形式参函数的定义形式如下:

返回下一页上一页8.2函数定义的一般形式类型标识符函数名(形式参数表列){声明部分语句}有参函数比无参函数多了一个内容,即形式参数表列。返回上一页8.3函数的参数和函数的值8.3.1形式参数和实际参数函数的形参和实参具有以下特点。(1)形参只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。(2)形参可以是变量或数组(3)实参和形参在数量、类型、川页序上应严格一致,否则会出现类型不匹配的错误。(4)函数调用中形参与实参间的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。返回下一页8.3函数的参数和函数的值8.3.2函数的返回值函数的值是指函数被调用时,执行函数体中的程序段所取得的并返回给主调函数的值。(1)函数的值只能通过return语句返回主调函数。(2)函数值的类型和return语句中表达式值的类型应保持一致。(3)如函数值为整型,在函数定义时可以省去类型说明。(4)不返回函数值的函数,可以明确定义为“空类型”,类型说明符为“void”。返回上一页8.4函数的调用8.4.1函数调用的一般形式前面已经说过,在程序中是通过对函数的调用来执行函数体的,其过程与其他语言的子程序调用相似。C语言中,函数调用的一般形式为:函数名(实际参数表)8.4.2函数调用的方式在C语言中,可以用以下几种方式调用函数。返回下一页8.4函数的调用(1)函数表达式(2)函数语句(3)函数实参8.4.3被调用函数的声明在主调函数中调用某函数之前应对该被调函数进行说明(声明),这与使用变量之前要先进行变量说明是一样的。在主调函数中对被调函数作说明的日的是使编译系统知道被调函数返回值的类型,以便在主调函数中按此种类型对返回值作相应的处理。返回下一页上一页8.4函数的调用其一般形式为:类型说明符被调函数名(类型形参,类型形参…);或为:类型说明符被调函数名(类型,类型…);括号内给出了形参的类型和形参名,或只给出形参类型,这便于编译系统进行检错,以防止可能出现的错误。C语言中又规定在以下几种情况时可以省去在主调函数中对被调函数的说明。(1)如果被调函数的返回值是整型或字符型时,可以不对被调函数作说明,而直接调用。返回下一页上一页8.4函数的调用(2)当被调函数的函数定义出现在主调函数之前时,在主调函数中也可以不对被调函数再作说明而直接调用。(3)如在所有函数的定义之前,在函数外预先说明了各个函数的类型,则在以后的各主调函数中,可不再对被调函数作说明(4)对库函数的调用不需要再作说明,但必须把该函数的头文件用#include命令包含在源程序前部。返回上一页8.5函数的嵌套调用C语言中不允许作嵌套的函数定义,因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是C语言允许在一个函数的定义中出现对另一个函数的调用,这样就出现了函数的嵌套调用,即在被调函数中又调用其他函数,这与其他语言的子程序嵌

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论