c语言实用手册速查_第1页
c语言实用手册速查_第2页
c语言实用手册速查_第3页
c语言实用手册速查_第4页
c语言实用手册速查_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

第一章语言的特点及上机指导语言的特点简洁、紧凑,使用方便、灵活,易于学习和应用。语言是面向结构化程序设计的语言。允许直接对位、字节、和地址进行操作。运算符及数据类型(结构)丰富。语言生成的目标代码质量高,可移植性好。程序的上机步骤()在UNIX操作系统下运行C程序的步骤用编辑程序(如UNIX系统的广西行编辑程序ED,或屏幕编辑程序VI)将源程序输入计算机,经修改后存入文件系统(源程序的后辍一般为“C”)。编译。调用编译程序CC对源文件进行编译CCFC(FC为要编译的文件)连接。将目标程序的库函数或其它目标程序连接成可执行的目标程序。在UNIX系统下,连接是由CC自动完成的。最后得到的可执行目标文件名由系统自动确定为AOUT。若想指定文件名在编译时可打入命令CCOFOUTFC执行程序。输入可执行目标文件名后回车即可。以上过程可用下图表示开始编辑源程序FC编译目标程序有错FC无连接库函数可执行和其它目目标程序标程序AOUT执行结果正确结束()、在DOS下用MS编译程序运行程序的步骤编辑源程序。可用行编辑程序EDLIN或WORDSTAR。编译。要经过道编译,或称次扫描。假设文件名为则编译命令为CC1FC(第一次,作用为预处理)CC2FC(第二次,语法分析)CC3FC(第三次,编译)CC4FC(第四次,优化编译)连接。将编译好的目标文件同库函数连接起来。最简单命令为LINKF,CSLIB注CSLIB是系统库(CSYSTEMLIBRARY)的缩写。链接成功后得到的可执行文件名自动定为FEXE(文件名与源文件名相同,后缀改为EXE)。执行程序。只需输入目标文件名F()用URBO运行程序的步骤先将装入磁盘。调用URBO程序TC屏幕顶部出现一排“命令”行菜单FILEEDITRUNCOMPILEPROJECTOPTIONSDEBUG用光标键来选择各菜单项进行相应操作。编辑源文件。根据需要输入或修改源程序。编译源程序。按“F9”键即可进行编译、连接,并在屏幕上显示有无错误和有几个错误。根据此信息修改源程序,然后再重复此项操作。执行程序。按“F10”键,屏幕又出现上述菜单,选中RUN即可执行程序。可用“ALT”和“X”键脱离TURBO,回到操作命令状态,此时可用系统命令显示源程序和运行程序TYPEFC(列出源程序清单)F(执行目标程序FEXE)第二章数据类型语言的基本符号、基本符号26个英文字母(大小写表示分别表示两个不同的字符)10个阿拉伯数字()其它特殊符号,以运算符为主(、等)、标识符()基本概念在语言中变量名、数组名、函数名和其它由用户自定义的数据类型名,被统称为标识符。()标识符的书写规则只能由英文字母、数字和下划线构成;必须以字母或下划线开头;不能以保留字作为标识符。、函数语言的源程序由一个或多个函数组成,每个函数完成一种指定的操作,所以有人又把语言称为函数式语言。构成语言的函数必须有一个主函数(即MAIN函数),在语言的源程序结构中不可缺少的语句是“;”。语言的数据类型、概述一个程序应包括两个方面的主要内容()数据的描述;()操作步骤,即动作的描述。可以这样表示程序算法数据结构程序设计方法语言工具、数据类型整型字符型单精度型实型(浮点型)枚举类型双精度型数组类型数据类型构造类型结构体类型共用体类型指针类型空类型常量和符号常量、基本概念在程序运行过程中,其值不能被改变的量称为常量。可以用一个标识符代表一个常量,这种用一个标识符代表一个常量的,称为符号常量。即标识符形式的常量。、符号常量的特点一是符号常量的实际值易于修改;二是符号常量的意义比较明确。、关于符号常量的说明符号常量在程序中用DEFINE命令行定义,常量名后跟它代表的常量;符号常量的值在其作用域内不能改变,也不能再被赋值;习惯上符号常量名用大写,变量用小写,以示区别。常量的类型常量的类型有整型常量、实型常量、字符型常量和字符串常量四种。、整型常量()概述整型常量即整常数。整常数可用以下三种形式表示十进制整数。基本类型八进制整数。以开头的数是八进制数。如011,代表八进制数11。十六进制整数以0X开头的数。如0X123,代表16进制数123。()整型常量的类型INT型其值在3276732768范围内。可赋给INT型和LONGINT型变量。LONGINT型其值范围在21474836482147483647内。SHORTINT型范围同INT型。一个INT型的常量同时也是一个SHORTINT型常量。注意一个整型常量可以赋给一个长度不小于其长度的整型变量。在一个整常量后面加一个字母L或L,则认为是LONGINT型常量。这往往用于函数调用中。、实型常量又叫浮点数。有两种表示形式十进制数形式。由数字和小数点组成。(424也是一个常量)指数形式如123E3或123E3都代表123103。应注意字母E(或E)之前必须有数字,且E后面指数必须为整数,如21E35、E3E等都不是合法的指数形式。、字符型常量()概述字符型常量是用单引号括起来的一个字符。如A、A、等。注意A和A是不同的常量。还允许用一种特殊的字符常量,就是以一个“”开头的字符序列。这些字符通常是一些转义字符,如101(101为ASCII码(八进制)代表字符A。012代表“换行”。代表“回车”。字符常量一般用于替换操作。由预处理命令(DEFINE)定义,其命令行一般放在源程序中最前面部分。表常用的特殊字符(“转义字符”)字符形式功能换行横向跳格(即跳到下一个输出区)竖向跳格退格回车走纸换页反斜杠字符“”单引号(撇号)字符DDD到位进制数所代表的字符XHH到位16进制数所代表的字符说明“转义字符”以反斜杠打头,用来输出一些无法象一般字符那样明确写出来的字符。()字符型数据在内存中的存储形式及使用方法将一个字符常量放到一个字符变量中,实际上并不是把字符本身放到内存单元中,而是将该字符的相应的ASCII码放到存储单元中。它的存储形式与整数的存储形式相类似。所以字符型数据和整整数据之间可以通用。字符型数据既可以以字符形式输出,也可以以整数形式输出。也可以对字符型数据进行算术运算。字符数据与整型数据可以相互赋值。如INTICHARCIA;C97;注意有些系统(如PDP,VAX,TURBO)将字符变量所占用的字节的最高位当成符号位,即把字符处理成带符号的整数,这样输出结果与人们习惯不一致,容易出错。、字符串常量字符串常量是用一对双引号括起来的字符序列。如“HOWDOYOUDO”,“CHINA”,“”,“12345”。规定在每一个字符串的结尾处加一个“字符串结束标志00是一个ASCII码为0的字符,即“空操作字符”,它不引起任何控制动作,也不是一个可显示的字符。字符串的长度比它实际字符的个数多一(有一个结束标志0,该字符在字符串输出时并不输出)。需要用字符数组来存放。变量一、基本概念规定在程序中所有用到的变量都必须在程序中指定其类型,即“定义”。对变量的定义,一般是放在一个函数的开头部分。变量定义的一般形式为变量类型变量名变量可以一次性定义一个也可以一次性定义多个,但定义多个变量时,只能同时定义同种类型的变量,变量间用豆号隔开。如定义两个整型变量INTABJ,ABJ;说明变量名的命名规则与标识符的一样。习惯上变量名用小写字母。二、变量的类型变量可分为整型、实型、字符型等。、整型变量()整型变量的分类基本型以INT表示。短整型以SHORTINT表示。或SHORT表示。长整型以LONGINT表示。或以LONG表示。无符号型存储单元中全部二进位用作存放数本身,而不包括符号。又分为无符号整型、无符号短整型、无符号长整型。()各种类型(整型)的数据范围见下表表类型所占位数数的范围INT163276832767即215(2151)SHORTINT16同上LONGINT3221474836482147483647即31(311)UNSIGNEDINT16065535即0(2151)UNSIGNEDSHORT16同上即0(2151)UNSIGNEDLONG32042894967295即0(311)、实型变量实型变量分为单精度(FLOAT型)和双精度(DOUBLE型)两类。在一般系统中,一个FLOAT型数据在内存中占个字节,一个DOUBLE型数据占个字节。FLOAT型实数提供位有效数字,DOUBLE型提供1516位有效数字,数值的范围随机器系统而异。在IBMPCMSC中,单精度实数的数值范围约为10381038,双精度实数范围约为1030810308。、字符变量字符型变量用来存放字符型常量,一个字符变量只能放一个字符。字符型变量用“CHAR”来定义,一般以一个字节来存放一个字符变量,或者说一个字符变量在内存中占一个字节。字符变量可以接收整型数据。三、变量赋初值程序中需要对一些变量预先设置初值。定义变量时赋初值INTZJJ,KD;先定义然后再赋初值INTZJJ;ZJJ;注意定义变量时不能以连等的形式给多个变量赋同一值。也不能同时在定义一个变量后,接着给该变量赋值。如INTJ,J;以及INTAK1AK2AK3;都是错误的。初始化不是在编译阶段完成的(静态存储变量和外部变量的初始化除外),而是在程序运行时执行本函数时赋以初值的。相当于有一个赋值语句。例如INT;相当于INT;各类数值型数据间的混合运算整型、单精度型、双精度型数据可以混合运算。整型、实型、字符型数据间也可以混合运算。如101587651234是合法的。在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。转换的规则如右图。转换过程是由系统自动进行的。第三章运算符与表达式DOUBLEFLOAT高LONGUNSIGNED低INTCHAR,SHORT语言的运算符范围很宽,把除了控制语句和输入输出以外的几乎所有的基本操作都作为运算符处理。算术运算符及算术表达式、基本的算术运算符(见下表)、算术表达式用算术运算符和括号将运算对象(也称操作数)连接起来的、符合语法规则的式子,称算术表达式。运算对象包括常量、变量、函数等。说明如果一个运算符的两侧的数据类型不同,则先自动进行类型转换,使二者具有同一种类型,然后进行运算。可以利用强制类型转换运算符将一个表达式转换成所需类型。如(INT)(XY)将的值转换成整型在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。在进行除法运算时如果两个整数中有一个为负值,则舍入的方向是不固定的。如53在有的机器上得到的结果为,有的机器上则给出结果。所有实数都按DOUBLE型进行运算。、自增、自减运算符作用是使变量的值增或减,如,(在使用之前,先使的值加(减)种类运算符含义备注结合性加法运算或正值运算减法运算或负值运算和乘法运算符和除法运算符两个整数相除结果为整数算术运算符的基本类型模运算或称求余运算要求其两侧均为整型量。自左自右结合即左结合性,(在使用之后,使的值加(减)说明自增运算符和自减运算符,只能用于变量,不能用于常量或表达式。和的结合方向为“自右自左”(指变量的左边还有另外同级运算符时)。自增(减)运算符常用于循环语句中使循环变量自动加。也用于指针变量,使指针指向下一个地址。使用和时会出现一些人们“想不到”的副作用,初学者要慎用。、有关表达式使用中的问题说明在表达式中包含自加或自减运算时,很容易出错。如若则表达式()()()的值是(TURBO和MS系统),然后自加变为。再如()()()先对自加得,然后进行运算,故得18。有的运算符由两个字符组成时,在表达式中应尽可能多地自左而右将若干个字符组成一个运算符。如应结合成()在调用函数时,实参数的求值顺序若有上述类似问题,标准并无统一规定。如PRINTF(”D,D”,);有的系统中从左至右求值,输出“,”。而在多数系统中对函数参数的求值顺序是自右而,所以上面函数中要输出两个表达式的值,先计算出的值再计算的值。赋值运算符和赋值表达式、赋值运算符赋值符号“”就是赋值运算符,它的作用是将一个数据赋给一个变量。扩展的赋值运算符(复合的赋值运算符)在赋值符之前加上其它运算符构成。类型示例说明等价于等价于()等价于()、函数的返回值函数返回值是通过函数中的RETURN语句来获得的。一个函数可以有一个以上的RETURN语句。函数值的类型。应当在定义函数时指定函数值的类型。如果函数值的类型和RETURN语句中表达式的值不一致,则以函数类型为准。如果被调用函数中没有RETURN语句,并不带回一个确定的、用户所希望得到的函数值,即带回的是一个不确定的值。为了明确表示“不带回值”,可用“VOID”定义为“无类型”(或称“空类型”)函数的调用定义了一个函数后,必须调用该函数才能执行该函数。、函数调用的一般形式为函数我(实参表列)说明实参的个数和类型必须和形参的个数与类型一致。、函数调用的方式()函数语句。即把函数调用作为一个语句。函数名(实参表);这种调用方式可以忽略返回值或没有返回值的函数。()函数表达式。函数(调用)出现在表达式中。这种表达式称为函数表达式。变量名函数表达式;如MAXA,B()函数参数。函数调用作为一个函数的实参。变量名函数名(实参,函数)如MMAXA,MAXB,C、对被调函数的说明()被调用的函数必须已经存在(是库函数或用户自定义的函数)。()如果是库函数,一般还应该在本文件开头用INCLUDE命令将调用有关库数时所需用到的信息包含到本文件来。()如果使用用户自定义的函数,而且该函数与调用它的函数(即主调整函数)在同一文件中,一般还应该在主调函数中对被调用函数的返回值的类型进行说明。说明如果函数的返回值是整型或字符型,可以不必进行说明。被调用函的定义出现在主调函数之前可以不必加以说明。如果已在所有函数定义之前,在文件的开头,在函数的外部已说明了函数类型,则在各个主调函数中不必对所调用的函数再作类型说明。、函数的嵌套调用语言不能嵌套定义函数,但可以嵌套调用函数。就是说,在调用一个函数的过程中又调用另一函数。、函数的递归调用在调用一个函数的过程中又出现直接或间接地调用该函数本身。用于解决递归问题(回推、递推两个阶段)。数组作为函数参数、数组元素做函数实参数组元素作为函数参数,其用法与变量相同,是单向传递即“值传送”方式。、数组名也可以数组名作为函数参数,此时实参与形参都应用数组名(或用数组指针),传递的是整个数组。说明用数组名作函数参数,应该在主调函数和被调函数分别定义数组,不能只在一方定义。实参数组与形参数组类型应一致,否则出错。实参数组与形参数组大小可一致也可以不致。数组名作函数参数时不是“值传递”,而是把实参数组的起始地址传递给形参数组。、多维数组也可以作函数参数。局部变量和全局变量、局部变量在一个函数内部定义的只能在本函数内才能使用的,在此函数外不能使用的变量,称为“局部变量”。说明主函数MAIN中定义的变量(M,N)也只在主函数中有效,不因为在主函数中定义而在整个文件或程序中有效。主函数也不能使用其它函数中定义的变量。不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。形参也是局部变量。在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也可称为“分程序”或“程序块”。、全局变量在函数之外定义定义的变量。全局变量可以为本文件中其它函数所共用。其有效范围是从定义变量的位置开始到本源文件结束。说明()设全局变量的作用是增加了函数间数据联系的渠道;还可以减少函数参与形参的个数。语言规定,局部数组不能赋初值。()不再必要时,不要使用全局变量。因为全局变量在程序的全部执行过程中都占用存储单元;降低了函数的通用性。外部变量与其它文件的变量同名时,会出现问题;使用过多会降低程序的清晰性,人们往往难以清楚地判断出每个瞬时各个外部变量的值。()如果外部变量在文件开头定义,则在整个文件范围内都可以使用该外部变量。如果在定义点之前的函数相引用该外部变量,则应该在该函数中用关键字“EXTERN”作“外部变量说明”。注外部变量的定义和外部变量说明不是一回事。外部变量的定义只能有一次,它的定义在所有函数之外,而同一文件中的外部变量的说明可以有多次,它的位置在函数之内(哪个函数用就在哪个函数中说明)。原则上所有函数都应当对所用的外部变量和说明,只是为简人起见,允许在外部变量的定义点之后的函数可以省略写这个“说明”。()如果在同一源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量不起作用。动态存储变量与静态存储变量、变量的存储类别()从变量的作用域(即从空间)角度来分可分为全局变量和局部变量。()从变量存在的时间(即生存期)角度来分可分为静态存储变量和动态存储变量。所谓静态存储方式是指在程序运行期间分配固定的存储空间的方式。而动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。在内存中可供用户使用的存储空间可以分为三部分程序区静态存储区动态存储区全局变量存放在静态存储区中,在程序执行过程中,它们占据固定的存储单元。()在动态存储区中存放下列数据函数形参变量。局部变量(未加STATIC说明的局部变量。即自动变量。)函数调用时的现场保护和返回地址等。在语言中每一个变量和函数有两个属性数据类型和数据的存储类别。、局部变量的存储方式()函数中的局部变量,如不做专门的说明(说明为静态的存储类别),都是动态分配存储空间的,存储在动态存储区中。这类局部变量称为自动变量。自动变量用关键字AUTO作存储类型的说明,“AUTO”也可以省略不写,此时系统默认为自动变量。()函数中的局部变量在函数调用结束后,仍希望不释放其存储单元,而在下次调用该函数时沿用其值(上次调用结束时的值)。这时就用STATIC说明为“局部静态变量”。对局部静态变量的说明局部静态变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期都不释放。对局部静态变量是在编译时赋初值的,即只赋初值一次。以后每调用函数时不再重新赋初值,而只是保留上一次函数调用结束时的值。而自动变量每调用函数一次就赋一次初值。如在定义局部变量不赋初值的话,则对静态变量来说,编译时自动赋初值(对数值型变量)或空字符。而对自动变量来说,如果不赋初值,则它的值是一个不确定的值。规定,只有在定义全局变量和局部静态变量时才能对数组初始化。虽然局部静态变量在函数调用结束后仍然存在,但其它函数是不能引用它的。局部静态变量的用法需要保留函数上一次调用结束时的值。如果初始化后,变量只被引用而不改变其值,则这时用局部静态变量比较方便,以便每次调用时重新赋值。函数中的数组要初始化时必须用局部静态类别。注意如果数组的值在函数调用过程中被改变了,将影响下一次调用时的初值。用静态存储要多占内存,而且降低了程序的可读性,当调用次数多时往往弄不清局部静态变量的当前值是什么。因此,如不必要,不要多用局部静态变量。()一般情况下,变量(包括静态存储方式和动态存储方式)的值是存放在内存中的。为提高执行效率,语言允许将局部变量的值放在运算器中的寄存器中,需要时直接从寄存器取出参加运算不必再到内存中去存取。这种变量叫做“寄存器变量”,用关键字REGISTER作说明。说明只有局部自动变量和形式参数可以作为寄存器变量,其它(如全局变量)不行。一个计算机系统中寄存器数目是有限的,不能定义任意多个寄存器变量。不同的系统对REGISTER变量的处理是不同的,微机上用的、URC对REGISTER变量当作自动变量处理,分配内存单元,并不真正把它们存放在寄存器中,因此,虽然程序合法,但并不提高执行速度。局部静态变量不能定义为寄存器变量。不能写成REGISTERSTATICINTA,B,C;不能把变量A,B,C既放在静态存储区中,又放在寄存器中,二者只能居其一。全局变量的存储方式、全局变量是在函数的外部定义的,编译时分配在静态存储区。全局变量可以为程序中各个函数所引用。、全局变量的使用范围允许其它文件(同属一个程序)中的函数引用。应该在需要引用它的文件中,用EXTERN作说明。只被本文件中的函数引用。这时可以在定义外部变量时前面加一个STATIC说明。这种加上STATIC说明、只能用于本文件的外部变量(全局变量)称为静态外部变量,或称为“函数外部静态变量”。注对外部变量加STATIC说明,并不意味着这时才是静态存储(存放在静态存储区中),而不加STATIC的是动态存储(存放在动态存储区)。两种形式的外部变量都是静态存储方式,只是作用范围不同而已。C存储类别小结对一个数据的定义,需要指定两各属性数据类型和存储类别,分别用两个关键字进行定义。STATICINTA(静态内部变量或静态外部变量)AUTOCHARC(自动变量,在函数内定义)REGISTERINTD(寄存器变量,在函数内定义)另外,在对变量作说明时,可以用EXTERN说明某变量为已定义的外部变量。、从作用域角度分,有局部变量和全局变量。它们采取以下的存储类别自动变量,即动态局部变量(离开函数,值就消失)静态局部变量(离开函数,值仍保留)寄存器变量(离开函数,值就消失)(形式参数可以定义为自动变量或寄存器变量)局部变量静态外部变量(只限本文件引用)外部变量(即非静态的外部变量,允许其它文件引用)、从变量存在的时间来区分,有动态存储和静态存储类型。静态存储是程序整个运行时间都存在,而动态存储则是在调用函数时临时分配单元。自动变量(本函数内有效)动态存储寄存器变量(本函数内有效)形式参数静态局部变量(函数内有效静态存储静态外部变量(本文件内有效)外部变量(其它文件可引用)、从变量值存放的位置来区分静态局部变量内存中静态存储区静态外部变量(函数外部静态变量)外部变量(其它文件可引用)内存中动态存储区自动变量和形式参数CPU中的寄存器寄存器变量、关于作用域和生存期的概念。内部函数和外部函数、内部函数如果一个函数只能被本文件中其它函数所调用,它称为内部函数。在定义内部函数名和函数类型前面加STATIC。即STATIC类型标识符函数名(形参表)内部函数又称静态函数。使用内部函数可以使函数只局限于所在文件,如果在不同的文件中有同名的内部函数,互不干扰。全局变量、外部函数在定义函数时,如果冠以关键字EXTERN,表示此函数是外部函数。在需用调用此类函数的文件中,一般要用EXTERN说明所用的函数是外部函数。第八章编译预处理语言提供编译预处理功能,这是它与其它高级语言的一个重要区别。“编译预处理”是编译系统和一个组成部分。语言允许在程序中使用几种特殊的命令(它们不是一般的语句)。在编译系统对程序进行通常的编译之前,先对程序中这些特殊的命令进行“预处理”,然后将预处理的结果和源程序一起再进行通常的编译处理,以得到目标代码。提供的预处理功能主要有以下三种、宏定义;、文件包含;、条件编译。分别用宏定义命令、文件包含命令、条件编译命令来实现。这些命令以符号“”开头。宏定义、不带参数的宏定义(定义一个符号常量)用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为DEFINE标识符字符串如DEFINEPI31415926它的作用是指定用标识符PI来代替“31415926”这个字符串,在编译预处理时,把程序中在该命令以后的所有的PI都用“31415926”代替。这个标符(名字)称为“宏名”,在预编译时将宏名替换成字符串的过程称为“宏展开”。DEFINE是宏定义命令。说明宏名一般习惯用大写字母表示,以与变量名相区别。使用宏名代替一个字符串,可以减少程序中重复书写某些字符字符串的工作量。同时也便与修改。使用宏定义可提高程序的可移值性。宏定义是用宏名代替一个字符串,也就是作简单的置换,不作语法检查。只有在编译已被宏展开后的源程序时才报错。宏定义不是语句,不恬行末加分号。DEFINE命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常DEFINE写在文件开头,函数之前,作为文件一部分,在此文件范围内有效。可以用UNDEF命令终止宏定义的作用域。如DEFINE98MAINUNDEFF1由于UNDEF的作用,使的作用范围在UNDEF行处终止。在进行宏定义时,可以引用已定义的宏名,可以层层置换。对程序中用双引号括起来的字符串内的字符,即使与宏名相同,也不进行置换。、带参数的宏定义()形式不是进行简单的字符串替换,还要进行参数替换,其定义的一般形式为DEFINE宏名(参数表)字符串字符串中包含在括弧中所指定的参数。如DEFINEA,BABAREA3,2;定义矩形面积,和是边长。赋值语句展开为AREA32;()展开置换的方式在程序中如果有带实参的宏,则按DEFINE命令行中指定的字符串从左到右进行置换。如果串中包含宏中的形参,则将程序语句中相应的实参(可以是常量、变量或表达式)代替形参,如果宏定义中的字符串中的字符中不是参数字符,则保留。说明对带参数的宏的展开只是将语句中的宏名后面括号内的实参字符串代替DEFINE命令行中的形参。在宏定义时,在宏名与带参灵敏的括弧之间不应加空格,否则将空格以后的字符都作为替代字符串的一部分。注意带参数的宏和函数的的区别函数调用时,先求出实参表达式的值,然后代入形参,而使用带参数的宏只是进行简单的字符替换函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有“返回值”的概念。对函数中的实参和形参都要定义类型,二者的类型要求一致,如不一致,应进行类型转换。而宏不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符即可。宏定义时,字符串可以是任何类型的数据。调用函数只可得到一个返回值,而用宏可以设法得到几个结果。使用宏次数多时,宏展开后源程序长,因为每展开产次都使程序增长,而函数调用不使源程序变长。宏替换不占运行时间,只占编译时间。而函数调用则占运行时间(分配单元、保留现场、值传递、返回)。一般用宏来代表简短的表达式比较合适。有些问题,用宏和函数都可以。利用宏可以实现程序的简化。注意在宏展开实现参数替换时,双引号内字符串中与参数名相同的字符是否被替换,各个C系统有不同的规定。文件包含处理所谓“文件包含”处理是批量个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。其一般形式为INCLUDE“文件名”其好处是可以节省程序设计人没的重复劳动。注意“文件包含”处理并不是联接两个文件,而是作为一个源程序编译,得到一个目标文件。这种常用在文件头部的被包含的文件称为“标题文件”或“头部文件”常以“H”为后缀。说明、一个INCLUDE命令只能指定一个被包含文件,如果要包含N个文件,要用N个INCLUDE命令。、如果文件包含文件,而文件中要用到文件的内容,则可在文件中用两个INCLUDE命令分别包含文件和文件,而且文件应出现在文件之前。、在一个被包含文件中又可以包含另一个被包含文件,即文件包含是可以嵌套的。、在INCLUDE命令中,文件名可以用双引号或尖括号括起来。二者的区别是用双引号的,系统先在引用被包含文件的源文件所在的文件目录中寻找要包含的文件,若找不到,再提案系统指定定的标准方式检索其它目录。而用尖括弧时,不检查源文件所在的文件目录而直接按系统标准方式检索文件目录。一般说,用双引号比较保险。、被包含文件与其所在的文件(即用INCLUDE命令的源文件),在预编译后已成为同一个文件(而不是两个文件)。因此,文件中的全局静态变量仍然有效,不必用EXTERN说明。条件编译一般情况下源程序中所有的行都参加编译,但是有进希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。采用条件编译的好处是可以减少被编译的语句,从而减少目标程序的长度。还有利于程序的可移植性,增加程序的灵活性。、条件编译命令的几种形式()IFDEF标识符程序段ELSE程序段ENDIF其中ELSE部分可以没有。这里的程序段可以是语句组,也可以是命令行。为了提高程序的通用性(在任何系统上运行),可以用以下的条件编译IFDEFIBMPCDEFINEINTEGER_SIZE16ELSEDEFINEINTEGER_SIZE32ENDIF()IFNDEF标识符程序段ELSE程序段ENDIF这种形式与第一种形式的作用相反。即标识符未被定义时编译程序段。()IF表达式程序段ELSE程序段ENDIF第九章指针概述1、使用指针的好处()正确而灵活地运用指针可以有效地表示复杂的数据结构;能动态分配内存;能方便地使用字符串;有效而方便地使用数组;在调用函数时能得到多于1个的值;能直接处理内存地址等。()掌握指针的应用,可以使程序简洁、紧凑、高效。、地址的概念内存区的每一个字节有一个编号,这个编号就是“地址”,它相当于旅馆中的房间号。、数据在内存中的读取方式()直接访问按变量地址存取变量值的方式,即根据变量名与地址的对应关系,找到变量的地址,然后从该地址开始的字节中取出数据(即变量的值)。()简接访问先从存放变量的地址的内存单元中读取变量的地址,然后在与读出的地址值相符的内存单元中取出变量的值。、指针的概念一个变量的地址称为该变量的“指针”。专门用来存放另一变量的地址的变量称为“指针变量”。指针变量中只能存放地址(指针)。变量的指针和指向变量的指针变量变量的指针就是变量的地址。为了表示指针变量和它所指向的变量之间的联系,用“”符号表示“指向”。、指针变量的定义指针变量不同于其它类型的变量,它是用来专门存放地址的。必须将它定义为“指针类型”。指地变量定义的一般形式为类型标识符标识符(或变量名);注意标识符前面的“”,表示该变量为指针变量。一个指针变量只能指向同一个类型的变量。、指针变量的引用有关的运算符()CHARNAME20/学生姓名/CHARSEX/性别/INTAGE/年龄/FLOATSCORE/成绩/CHARADDR30/地址/定义结构体类型变量的方法要定义一个结构体类型的变量,可以采取以下三种方法。一、先定义结构体类型再定义变量名如上面已定义了一个结构体类型STRUCTSTUDENT,可以用它来定义变量。如STRUCTSTUDENTSTUDENT1,STUDENT2;定义STUDENT1,STUDENT2为STRUCTSTUDENT类型变量,即它们具有STRUCTSTUDENT类型的结构。如10001ZHANGXINM19905SHANGHAI10002WANGLIF2098BEIJING注意将一个变量定义为标准类型(基本数据类型)与定义为结构体类型不同之处在于后者不仅要求指定变量为结构体类型,而且要求指定为某一特定的结构体类型(例如,STRUCTSTUDENT),不能只指定为“STRUCT型”而不指定结构体名。而在定义变量为整型时,只需指定为INT型即可。换句话说,可以定义许多种具体的结构体类型。为了使用方便,人们通常用一个符号常量代表一个结构体类型。在程序开头,用DEFINESTUDENTSTRUCTSTUDENT这样在程序中,STUDENT与STRUCTSTUDENT完全等效。可以直接用STUDENT定义变量。如果程序规模比较大,往往对结构体类型的定义集中放到一个文件(以H为后缀的“头文件”)中。二、在定义类型的同时定义变量一般形式为STRUCT结构体名成员表列变量名表列;如STRUCTSTUDENTINTNUMSTRDENT1STRDENT2CHARNAME20/学生姓名/CHARSEX/性别/INTAGE/年龄/FLOATSCORE/成绩/CHARADDR30/地址/STUDENT1,STUDENT2;三、直接定义结构类型变量其一般形式为STRUCT成员表列变量表列;即不出现结构体名。关于结构体类型的几点说明、类型与变量是不同的概念,不要混同。对结构体变量来说,在定义时一般先定义一个结构体类型,然后定义变量为该类型。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的。、对结构体中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。、成员也可以是一个结构体变量。即结构体可以嵌套。在前面的结构体定义示例中,若加入一个“日期”成员(用BIRTHDAY表示),则该成员变量又可以定义成一个结构体,它可以包含“年”、“月”、“日”三个成员。、成员名可以与程序中的变量名相同,二者不代表同一对象。且互不干扰。结构体类型变量的引用在定义了结构体变量以后,就可以引用这个变量了。但应遵守以下规则、不能将一个结构体变量作为一个整体进行输入和输出。如已定义的STUDENT1为结构体变量并且它已有值。不能这样引用PRINTF“D,S,C,D,F,SN”,STRDENT1;只能对结构体变量中的各个成员分别输出。引用方式为结构体变量名成员名如STRDENT1NUM表示STUDENT1变量中的NUM成员。可以对变量的成员赋值,如STRDENT1NUM10010;“”是成员(分量)运算符,它在所有的运算符中优先级最高,新标准C允许将一个结构体变量直接赋值给另一个具有相同结构的结构体变量。、如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。注意不能用一个结构体变量来访问该变量中的属于结构体变量的成员。如STUDENT1BIRTHDAY这种访问方式是错误的。因为BIRTHDAY本身是一个结构体变量。、对成员变量可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。、可以引用成员的地址,也可以引用结构体变量的地址。如SCANF(“D”,/学生姓名/CHARSEX/性别/INTAGE/年龄/FLOATSCORE/成绩/CHARADDR30/地址/STUDENT189031,“LILIN”,M,“123BEIJINGROAD”;二、对静态存储类型的结构体变量进行初始化。即把上述过程放在主函数内。三、过去许多C版本规定,自动变量不能在定义时赋初值,只能在函数执行时用赋值语句对各成员分别赋值。新的C标准无此限制,允许对自动变量初始化。结构体数组结构体数组的每一组数据(即每一个数组元素)都是一个结构体类型的数据,它们分别包括各个成员(分量)项。一、结构体数组的定义和定义结构体变量的方法相似,只需说明其为数组即可(即把变量名换成数组名)。、定义结构体的同时定义一个结构体数组(同定义结构体变量)。、定义结构体后再定义一个结构体数组(同定义结构体变量)。用此方法定义结构体数组时与定义数值型数组相比只是定义关键字(类型标识符)不同而已。二、结构体数组的初始化定义结构体数组时初始化,其一般形式是在定义数组的后面加上初值表列;(同数值型数组的列表赋初值)指向结构体类型数据的指针一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来批晌结构体数组中的元素。一、指向结构体变量的指针以下三种形式等价结构体变量成员名;(P)成员名;P成员名有关运算PN得到P指向的结构体变量中的成员N的值。PN得到P指向的结构体变量中的成员N的值,用完该值后使它加1。PN得到P指向的结构体变量中的成员N的值使之加1(先加)。二、指向结构体数组的指针对结构体数组及其元素也可以用指针或指针变量来指向。注意、如果P的初值为STU,即指向第一个元素,则P1后指向下一个元素的起始地址。如(P)NUM先使P自加,然后得到它指向的元素中的NUM成员值。(P)NUM先得到值,然后使P自加。、指针P已定义为指向STRUCTSTUDENT类型的数据,它只能指向一个结构体型数据,而不能指向一元素中的某一成员。千万不要认为反正P是存放地址的,可以将任何地址赋给它。三、用指向结构体的指针作函数参数将一个结构体变量的值传递给另一个函数的方法用结构体变量的成员作参数用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给形参。用指针作函数参数能提高运行效率。用指针处理链表一、链表概述链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。链表有一个“头指针”变量和一个“表尾”(最后一个元素),“头指针”变量存放一个地址。该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括在两个部分一为用户需要用的实际数据,二为下一个结点的地址。“表尾”的地址部分放一个“NULL”(表示“空地址”),链表到止结束。链表中各元素在内存中可以不是连续存放。如果不提供“头指针”,则整个链表都无法访问。链表如同一条铁链一样,一环扣一环,中间是不能断开的。一个结点中应包含一个指针变量,用它存放下一结点的地址。为了动态地开辟和释放存储单元,C语言编译系统的库函数提供了以下函数、MALLOCSIZE在内存的动态存储区中分配一个长度为SIZE的连续空间。此函数的值(即“返回值”)是一个指针,它的值是该分配域的起始地址。如果此函数未能成功地执行,则返回值

温馨提示

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

评论

0/150

提交评论