做网站广告,网站制作风格,新乡哪有网站建设公司,wordpress清除主题信息全国计算机等级考试 二级C语言考前复习资料#xff08;笔试#xff09; 第一课C语言程序设计基础 本课主要知识点#xff1a; 1.知识点#xff1a;C程序基础 l C语言是一种结构化程序设计语言。三种基本结构#xff1a;顺序、选择、循环。 例1#xff1a;#xff08;20… 全国计算机等级考试 二级C语言考前复习资料笔试 第一课C语言程序设计基础 本课主要知识点 1.知识点C程序基础 l C语言是一种结构化程序设计语言。三种基本结构顺序、选择、循环。 例12010-09-11以下关于结构化程序设计的叙述中正确的是C A一个结构化程序必须同时由顺序、分支、循环三种结构组成 B 结构化程序使用goto语句会很便捷 C 在C语言中程序的模块化是利用函数实现的 D由三种基本结构构成的程序只能解决小规模的问题 例22011-03-26计算机高级语言程序的运行方法有编译执行和解释执行两种以下叙述中正确的是A A)C语言程序仅可以编译执行 B)C语言程序仅可以解释执行 C)C语言程序既可以编译执行又可以解释执行 D)以上说法都不对 【解析】计算机不能直接理解高级语言只能直接理解机器语言所以必须要把高级语言翻译成机器语言计算机才能执行高级语言编写的程序。翻译的方式有两种一个是编译一个是解释。C语言程序仅可以编译。 例32011-03-26以下叙述中错误的是( D) A)C语言的可执行程序是由一系列机器指令构成的 B)用C语言编写的源程序不能直接在计算机上运行 C)通过编译得到的二进制目标程序需要连接才可以运行 D)在没有安装C语言集成开发环境的机器上不能运行C源程序生成的.exe文件 【解析】C程序开发过程编辑—.c编译—.obj链接—可执行文件.exe 2.知识点C语言程序的构成 l C程序是由函数构成的一个C程序有且仅有一个main函数。一个函数由两部分组成函数的首部和函数体。函数体包括声明部分和执行部分。一个C程序总是从main函数开始执行即程序的入口由main函数结束即程序的出口。 例12010-03-12以下叙述正确的是B AC语言程序是由过程和函数组成的 B C语言函数可以嵌套调用例如fun(fun(x)) C C语言函数不可以单独编译 DC语言中除了main函数其他函数不可作为单独文件形式存在 例22011-09-11以下叙述中错误的是 C A.C语言编写的函数源程序其文件名后缀可以是C B.C语言编写的函数都可以作为一个独立的源程序文件 C.C语言编写的每个函数都可以进行独立的编译并执行 D.一个C语言程序只能有一个主函数 3.知识点标识符 l 命名规则 ①标识符中只能包含字母(a-z,A-Z)数字(0-9),下划线(_)。 ②第一个字符必须是字母或下划线。 分类 ③用户自定义的标识符 ⅰ格式合法ⅱ不能使用关键字ⅲ见名知意 例12010-03-13以下C语言用户标识符中不合法的是D A)_1 B)AaBc C)a_b D)a-b 4.知识点数据类型 例12010-03-16以下关于C语言数据类型使用的叙述中错误的是D A)若要准确无误差的表示自然数应使用整数类型 B)若要保存带有多位小数的数据应使用双精度类型 C)若要处理如“人员信息”等含有不同类型的相关数据应自定义结构体类型 D)若只处理“真”和“假”两种逻辑值应使用逻辑类型 【解析】结构数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的一个结构类型的值可以分解成若干个“成员”或“元素”每个“成员”都是一个基本数据类型或又是一个构造类型C项正确。C语言没有逻辑类型故D项错误。 例22011-03-26定义无符号整数类为UInt,下面可以作为类UInt实例化值的是B A)-369 B)369 C)0.369 D)整数集合{1,2,3,4,5} 【解析】无符号整数类型为只有正整数和0所有选择B。 5.知识点常量 l 整型常量 十进制整常数没有前缀其数码为0-9。例如65535-568 八进制整常数以0开头其数码为0-7。例如015 十六进制整常数以0X或0x开头其数码为0-9A-F或a-f。例如0x2A 长整型数整型常数后缀为L或l。例如358000L 无符号数整型常数后缀为U或u。例如158u l 实型常量的形式 小数形式必须有小数点小数点前后不能同时没有数字。 指数形式aEn其中a表示十进制数E阶码标志n阶码。E前E后必须有数字E后必为整数可以带符号。例如2.1E-3、5E8 例12011-09-13以下选项中关于C语言常量的叙述错误的是D A.所谓常量是指在程序运行过程中其值不能被改变的量 B.常量分为整型常量、实型常量、字符常量和字符串常量 C.常量可分为数值型常量和非数值型常量 D.经常被使用的变量可定义成常量 【解析】根据常量的基本概念则不难判断A、B、C均正确。 例12009-04-13以下选项中能用作数据常量的是D A)o115 B)0118 C)1.5e1.5 D)115L 【解析】八进制整常数以0开头A项错误八进制整常数的数码味0-7B项错误实型常量的指数形式E后必为整数故C项错误长整型数后缀为L或l故D项正确。 例22010-03-26以下选项中可用作C程序合法实数的是 A A).1e0 B)3.0e0.2 C)E9 D)9.12E 【解析】实型指数表示方式“E前E后比有数E后必须是整数”故选A l 字符常量用单引号‘’括起来的一个字符。包括普通字符常量和转义字符。 普通字符常量如‘a’、‘A’、‘1’。 转义字符由一对单引号引起来的以\开头的若干字符的组合。如‘\n’表示回车换行、‘\\’表示反斜线符、‘\’’表示单引号符、‘\”’表示双引号、‘\ddd’表示八进制数、‘\xhh’表示十六进制数。 例32010-09-15以下选项中能表示合法常量的是C A)整数1,200 B)实数1.5E2.0 C字符斜杠‘\\’ D字符串“\007” 【解析】表示整常量不能用逗号分隔A项错误实型常量的指数形式E后必为整数故B项错误’\007’是转义字符只能用单引号括起来不能用双引号或其他括号故D项错误。例42010-03-26以下选项中不能用作C程序合法常量的是 B A)1,234 B)\123 C)123 D)\x7G 【解析】A中的‘’在编译时会出错的直接写成1234即可B是一个三位八进制数代表的字符C是一个数字常量D是一个字符串其中\x7是一个一位十六进制数代表的字符也即D中的字符串是两个字符如果sizeof的话是3如果strlen的话是2。 6.知识点变量 l 整型变量和实型变量 以考试标准Viusal c6.0为例说明各类型变量所占的位数。 类型 所占 位数 所占 字节数 类型 所占 位数 所占 字节数 short 16 2 unsigned int 32 4 int 32 4 unsigned long 32 4 long 32 4 float 32 4 unsigned short 16 2 double 64 8 例12010-09-38有以下程序 #include stdio.h main(0) {int s,t,A100;double B6; ssizeof(A); tsizeof(B); printf(“%d,%d\n”,s,t); } 在VC6平台上编译运行程序运行后的输出结果是(C) A)2,4 B)4,4 C)4,8 D)10,6 【解析】在VC6平台上int型占4个字节double型占8个字节故答案是C。 l 字符变量一个字符变量只能存放一个字符。字符串不能存放在字符变量中只能用字符数组或指针存放字符串。 例12009-09-22有以下定义语句编译时会出现编译错误的是(C) A)char a’a’ B)char a‘\n’ Cchar a‘aa’ Dchar a‘\x2d’ 【解析】一个字符变量只能存放一个字符A项字符变量存放的是普通字符常量B、D项字符变量存放的转义字符字符常量只能是单个字符不能是字符串’aa’不是单个字符故C项错误。 7.知识点ASCII码 l ‘0’的ASCII码值为48‘A’的ASCII码值为65‘a’的ASCII码值为97。 l 大写字母与小写字母的ASCII码值相差32。 例12009-09-23有以下程序 #include stdio.h main() {char c1,c2; c1’A’’8’-‘4’; c2’A’’8’-‘5’; printf(“%c,%d\n”,c1,c2); } 已知字母A的ASCII码为65程序运行后的输出结果是A A)E,68 B)D,69 C)E,D D)输出无定值 【解析】’A’的ASCII码值为65’8’的ASCII码值为56’4’的ASCII码值为52,6556-5269对应于字符’E’。’5’的ASCII码值为53,6556-5368对应于字符’D’。字符变量c1以%c格式输出即’E’。字符变量c2以%d格式输出即68。故答案是A。 8.知识点进制转换 l 十进制转换成二进制、八进制、十六进制将十进制的数字除以28、16得到的商数继续除以2直到商为0然后将各次相除所得的余数从后往前排列。 l 二进制、八进制、十六进制转换成十进制将二八、十六进制数的每一位数从高位到低位乘以2的n-1次幂n为该位所在的位数。 l 二进制与八进制之间的转换每个八进制数字转换成3位二进制数字。 l 二进制与十六进制之间的转换每个十六进制数字转换成4位二进制数字。 例12010-09以下程序运行后的输出结果是 2008 。 #include stdio.h main() {int a200,b010; printf“%d%d\n”,a,b } 【解析】八进制数010转换成十进制数为8按“%d%d”格式分别输出a、b即2008。 9.知识点运算符的优先级 级别由大到小:(逻辑)非 算(术运算符) 关(系运算符) (逻辑)与 (逻辑)或 条(件运算符) 赋(值运算符) 10.知识点强制类型转换运算符 l 一般形式类型说明符表达式 l 功能把表达式的运算结果强制转换成类型说明符所表示的类型 例12009-04-06表达式(int)((double)(5/2)2.5)的值是4。 【解析】(int)((double)(5/2)2.5)→(int)((double)2)2.5→(int)(2.0000002.5)→(int)(4.500000) →4。 例2以下程序运行后的输出结果是 。 main() { int a; a(int)((double)(3/2)0.5(int)1.99*2); printf(%d\n,a); } 答案3 【解析】(3/2)1(double)(3/2)0.51.5(int)1.99*22所以(double)(3/2)0.5(int)1.99*23.5故a3。 11.知识点算术运算符 、—、*、/、% %参与运算的量均为整型。 /当除号左右两边都是整数的时候商也要是整数如果不是整数则舍弃小数部分。当参与运算量有一个为实型则商为double型。 例12011-09-14若有定义语句inta10;double b3.14;,则表达式‘A’ab值得类型是C A.char B.int C.double D.float 【解析】各种类型数据混合运算时最终结果的类型可依据以下转换规律 char -short - int - long - float - double 例12011-09-15如有定义语句intx12,y8,z;,在其后执行语句z0.9x/y,则z的值为B A.1.9 B.1 C.2 D.2.4 【解析】x,y,z均为整型变量因此x/y结果为1即z0.911.9z最终结果为1 例12010-09-14有以下定义int along bdouble xy则以下选项中正确的表达式是A A)a%(int)(x-y) B)ax!y C) (a*y)%b D)yxyx 【解析】参与%运算的左右操作数均为整型故A项正确C项错误。B项是赋值语句不是表达式。赋值运算符左边必须是变量而不是表达式而D项中xyx错误。 12.知识点逗号表达式 l 一般形式表达式1表达式2……表达式n l 求值过程自左向右依次求解最后一个表达式的值为整个逗号表达式的值。 例12009-04-14设有定义int x2以下表达式中值不为6的是() A)x*x1 B)x,2*x C)x*(1x) D)2*x,x2 【解析】A项xx*(x1)2*(21)6B项x后x的值为3,2*x的值为6整个逗号表达式的值为6C项xx*(1x)2*36D项xx2224整个逗号表达式的值为4。故答案是D。 13.知识点自增自减运算符 i i自加1后再参与运算 i i参与运算后再自加1 --i i自减1后再参与运算 i-- i参与运算后再自减1 和- -的运算对象只能为变量不能是常量或表达式。 例12009-09-06若有定义语句int a5则表达式a的值是 5 。 【解析】表达式a的值是a未加1之前的值即5。. l 当或—与printf语句结合时若/--x的形式则先自增/自减然后输出若x/--的形式则先输出x原值在进行自增/自减操作。 例22011-03-26有以下程序 #include main() { int x011; printf(%d\n,x); } 程序运行后的输出结果是C A)12 B)11 C)10 D)9 【解析】011是一个八进制的数转为十进制则为1*819x是x先自增1再参与其他运算所以先x自增1为10再输出即为10故选C。 14.知识点赋值表达式 l 一般形式变量名表达式 l 赋值运算符左边必须是变量而不是表达式。 例12010-03-14若有定义double a22;int i0,k18则不符合C语言规定的赋值语句是 C A)aai B)iak(ik) C)ia%11 D)i!a 【解析】a为double型参与%运算的操作数均为整型故C项错误。 例22011-03-26若有定义语句int a3,b2,c1;以下选项中错误的赋值表达式是A A)a(b4)3; B)abc1; C)a(b4)c; D)a1(bc4); 【解析】赋值表达式的左边必须是变量不能是表达式。而答案A中4是一个赋值表达式。 l 复合赋值运算符和表达式 、—、*、/、%、、、 、 ^、 | 例22010-09-16表达式aa-a9的值是D A)9 B)-9 C)18 D)0 【解析】赋值运算符的结合性是从右到左a9→aa-90→aa0000。故答案是D。 15.知识点位运算 l 按位与运算 规则000 010 100 111 l 按位或运算| 规则0|00 0|11 1|01 1|11 l 按位异或运算∧ 规则0∧00 0∧11 1∧01 1∧10 l 求反运算~ 规则~01 ~10 l 左移运算 规则把左边的运算数的各二进位全部左移若干位高位丢弃低位补0。左移一位相当于该数乘以2。左移n位相当于该数乘以2n。 例12010-09-40有以下程序 #include stdio.h main() {short c124; cc____D____ printf(“%d\n”,c); } 若要使程序的运行结果为248应在下划线处填入的是 A)2 B)|248 C)0248 D)1 【解析】左移一位相当于该数乘以21241相当于124乘以2等于248。故答案是D。 例22009-04-39有以下程序 #include stdio.h main() {int a5,b1,t t(a2)|b printf(“%d\n”,t); } 程序运行后的输出结果是A A)21 B)11 C)6 D)1 【解析】左移2位相当于该数乘以22。52相当于5乘以4等于20。20|121。故答案是A。 l 右移运算 把左边的运算数的各二进位全部右移若干位。高位补0低位丢弃。右移一位相当于该数除以2。右移n位相当于除以2n。 例32009-09-39若有以下程序段 int r8 printf(“%d\n”,r1) 输出结果是C A)16 B)8 C)4 D)2 【解析】右移一位相当于该数除以2。81相当于除以2等于4故答案是C。 16.知识点关系运算符和表达式 例12010-09-08在C语言中当表达式值为0时表示逻辑值“假”当表达式值为 非0 时表示逻辑值“真”。 例22010-03-06设x为int型变量请写出一个关系表达式 (x%30)(x%70) 用以判断x同时为3和7的倍数时关系表达式的值为真。 17.知识点逻辑运算符和表达式 l 逻辑运算符优先级从高到低、、|| l 逻辑运算的真值表 a b ab a||b !a 真 真 真 真 假 真 假 假 真 假 假 真 假 真 真 假 假 假 假 真 l 进行逻辑运算时若左边的值为0则不再对右边的运算对象进行运算整个表达式的值为0。 例12011-09-17若有定义语句int k110,k220;,执行表达式k1k1k2(k2k2k1)后k1和k2的值分别为 B A. 0和1 B.0和20 C.10和1 D. 10和20 【解析】k1k2为假因此k1 k1k2结果0逻辑与左边表达式为假右边表达式不再处理因此k1结果为0k2不变仍为20 例2int a2则表达式(!a1)(a2)的值为0a的值为2。 【解析】a为0a1的值为0左边的值为0则不再对右边的运算对象进行运算所以a的值为2。 l 若||左边的运算对象的值为1则不再对右边的运算对象进行运算整个表达式的值为1。 例22010-03-17若a是数值类型则逻辑表达式(a1)||(a!1)的值是A A)1 B)0 C)2 D)不知道a的值不能确定 【解析】a的值有两种情况a等于1或a不等于1。故逻辑表达式(a1)||(a!1)的值为1。 18.知识点格式输入函数printf() (1)一般形式printf(“格式控制字符串”,输出列表) (2)遇到控制字符按照控制字符的规定输出遇到非格式字符串按原样输出。 例12009-04-07若变量x,y已定义为int类型且x的值为99y的值为9请将输出语句printf(“ x/y%d ”,x/y)补充完整使其输出的计算结果形式为x/y11。 例22009-04-15程序段int x12;double y3.141593;printf(“%d%8.6f”,x,y)的输出结果是A A)123.141593 B)123.141593 C)12,3.141593 D)123.1415930 【解析】以%8.6f格式输出即输出的总宽度为8小数的位数为6。 19.知识点格式输入函数scanf() 1一般形式scanf(“格式控制字符串”,地址列表) 2若格式控制字符串中有非格式字符串则按原样输入。若格式控制字符串中没有非格式字符作输入数据之间的间隔则可用空格、Tab、回车作间隔。 例1(2011-09-16)若有定义inta,b;,通过语句scanf(“%d;%d”,a,b);,能把整数3赋给变量a,5付给变量b的输入数据是 A.3 5 B.3,5 C.35 D.35 【解析】scanf格式字符串中两个%d之间带有非格式字符分号运行时应原样输入。 例1(2005-04-19)有以下程序 main() {int m,n,p; scanf(“m%dn%dp%d”,m,n,p); printf(“%d%d%d\n”,m,n,p); }若想从键盘上输入数据使变量m中的值为123n中的值为456p中的值为789则正确的输入是A A)m123n456p789 B)m123 n456 p789 C)m123,n456,p789 D)123 456 789 【解析】scanf(“m%dn%dp%d”,m,n,p);格式控制字符串中有非格式字符串则按原样输入故答案是A。 例2(2011-03-26)有以下程序段 char name[20]; int num; scanf(name%snum%d,name;num); 当执行上述程序并从键盘输入nameLili num1001回车后name的值A A)Lili B)nameLili C)Lili num D)nameLili num1001 【解析】scanf中格式字符串的非格式字符串原样输入如其中的‘name’和‘num’所以接受到的name值是后面的Lilinum值为1001。故选A。 3在输入字符数据时若格式控制字符串中无非格式字符则认为所有输入的字符均为有效字符。空格会被当作字符赋值给变量。 例32009-04-23有以下程序 #include stdio.h main() {int a1,a2; char c1,c2; scanf(“%d%c%d%c”,a1,c1,a2,c2); printf(“%d,%c,%d,%c”,a1,c1,a2,c2); }若想通过键盘输入使得a1的值为12a2的值为34c1的值为字符ac2的值为字符b程序输出结果是12a34b则正确的输入格式是以下_代表空格CR代表回车 A)12a34bCR B)12_a_34_bCR C)12,a,34,bCR D)12_a34_bCR 【解析】空格会被当作字符赋值给变量故B、D错误C项中逗号会被当作字符赋值给变量故C项错误。 4格式字符串 l 一般形式%[*][输入数据宽度][长度]类型 l *表示该输入项读入后不赋予相应的变量。 l 输入数据宽度用十进制数指定输入的字符数。 例42010-09-07有以下程序 #include stdio.h main() {int x,y; scanf(“%2d%ld”,x,y); printf(“%d\n”xy); }程序运行时输入1234567程序的运行结果是 34579 。 【解析】%2d输入的数据宽度为2x的值为12y的值为34567xy34579。 例52009-04-16若有定义语句double x,y,*px,*py执行了pxxpyy之后正确的输入语句是(C) A) scanf(“%f%f”,x,y); B)scanf(“%f%f”,x,y); C)scanf(“%lf%le”,px,py); D)scanf(“%lf%lf”,x,y); 【解析】A、D项地址列表应为x,yx、y为double型格式控制字符串不是%f%f故B项错误。 l 当定义的变量类型和scanf中“格式符”类型不一致时这里只限定在字符型和整型两种类型其他数据类型不可以。整型和字符型之间通过ASCALL可以相互转化。 例62011-03-12有以下程序 (说明字符0的ASCII码值为48) main() { charc1,c2; scanf(%d,c1); c2c19; printf(%c%c\n,c1,c2); }若程序运行时从键盘输入48回车则输出结果为 09。 【解析】输入48则c148c2489以字符输出c1和c2则为输出ASCII码为48和57对应的字符分别为0和9。 20.知识点字符输出函数putchar() 一般形式putchar(‘a’)putchar(‘\101’) 21.知识点字符输入函数getchar() 一般形式getchar()或chgetchar() 例12010-03-15有以下程序 #include stdio.h main() {char a,b,c,d; scanf(“%c%c”,a,b); cgetchar(); dgetchar(); printf(“%c%c%c%c\n”,a,b,c,d); }当执行程序时按下列方式输入数据从第1列开始CR代表回车注意回车也是一个字符 12CR 34CR 则输出结果是(B) A)1234 B)12 C)12 D)12 3 34 【解析】以%c格式读取一个字符以getchar()形式也是读取一个字符。空格会被当作字符赋值给变量。所以a’1’,b’2‘,c’\n’,d’3‘。 l getchar经常作为while循环条件判断输入哪一个字符时循环结束。例如输入字符串直到输入‘0’程序结束则可写成while( getchar()!0) 例22011-03-26有以下程序段 main() { … while( getchar()!\n); … }以下叙述中正确的是C A)此while语句将无限循环 B) getchar()不可以出现在while语句的条件表达式中 C)当执行此while语句时只有按回车键程序才能继续执行 D)当执行此while语句时按任意键程序就能继续执行 【解析】while条件表达式getchar()!\n只要输入的字符不是回车就一直执行循环而循环内是一个空语句所以按回车键程序才能继续执行选择C。 第二课 选择结构与循环结构 本课重要知识点 1.知识点if语句 l if表达式其中表达式可以是任意合法的C语言表达式。 例12011-09-19下列条件语句中输出结果与其他语句不同的是D A.ifa printf(“%d\n”,x); else printf(“%d\n”,y); B.ifa0 printf(“%d\n”,y); else printf(“%d\n”,x); C.ifa!0 printf(“%d\n”,x); else printf(“%d\n”,y); D.ifa0 printf(“%d\n”,x); else printf(“%d\n”,y); 【解析】作为if语句的条件a等价于a!0因此 A和C是等价的。 例22011-03-26if语句的基本形式是if(表达式)语句以下关于“表达式”值的叙述中正确的是D A)必须是逻辑值 B)必须是整数值 C)必须是正数 D)可以是任意合法的数值 【解析】表达式不限于关系表达式、逻辑表达式也可以是任意的数值类型其中非0为真0为假。故选D。 l 对于单个if语句其后跟随的受if控制的只能是1个语句或者是1个复合语句。 例12009-09-17设有定义int a1,b2,c3;以下语句中执行效果与其它三个不同的是C A)if(ab) caabbc B)if(ab){ caabbc} C)if(ab) caabbc D)if(ab){ caabbc} 【解析】对于单个if语句其后跟随的受if控制的只能是1个语句或者是1个复合语句。故C项if(ab)条件成立时语句ca;才被执行而无论if(ab)条件成立与否语句ab;bc;都会被执行。A、B、D项只有if(ab)条件成立时语句ca; ab;bc; 才被执行。 例22011-03-26以下程序运行后的输出结果是 200 main() { int x10,y20,t0; if(xy)tx;xy;yt; printf(%d %d\n,x,y); } 【解析】x10,y20所以xy为falsetx;不执行直接执行xy;yt;x为20y为0。注意和if(xy){tx;xy;yt;}区别。 l 当多个if(表达式)单分支形式并行出现时其执行顺序是先判断第一if单分支的条件如果为真执行其后面的语句执行完后继续向下执行。判断第二个if单分支语句依次类推。如果第一个if表达式的值为假则不执行其后的语句而去判断第二个if单分支条件。 例12011-03-26有以下程序 main() { int x; scanf(%d,x); if(x15) printf(%d,x-5); if(x10) printf(%d,x); if(x5) printf(%d\n,x5); }若程序运行时从键盘输入12回车则输出结果为 1217 【解析】输入12比较不大于15所以不执行if(x15)内的语句大于10执行printf(%d,x);输出12大于5执行printf(%d,x5);输出17。 2.知识点if语句的嵌套 l 内嵌结构中else总是与前面最近的且未曾配对的if语句配对组成一对if-else语句。 例22010-09-18有以下程序 #include stdio.h main() {int a1,b0; if(!a) b; else if(a0) if(a) b2; else b3; printf(“%d\n”,b); }程序运行后的输出结果是A A)0 B)1 C) 2 D)3 【解析】else总是与前面最近的且未曾配对的if语句配对组成一对if-else语句。即else b3; 与if(a) b2;配对。if(!a)不成立不执行b;else if(a0)不成立不执行if(a) b2; else b3;故直接执行printf(“%d\n”,b);输出结果为0。 3.知识点条件表达式 l 一般形式表达式1表达式2表达式3 l 执行过程表达式1的值为真条件表达式取表达式2的值表达式1的值为假条件表达式取表达式3的值。 例12009-09-19以下程序段中与语句kab?(bc?1:0):0功能相同的是A A)if((ab)(bc)) k1; B)if((ab)||(bc)) k1; else k0; else k0; C) if(ab) k0; D) if(ab)k1; else if(bc) k1; else if(bc) k1; else k0; 【解析】条件运算符的结合性是从右至左。当bc时bc?1:0的值为1kab?1:0同时当ab时ab?1:0的值为1此时k1。否则k0。故答案为A。 4.知识点switch语句 l switch语句的圆括号中的表达式的值必须是整型或字符型不能为实型。 l case后的表达式可以是求得整型和字符型的常量表达式但不能含有变量。 l default的位置对程序的执行没有影响。 例12010-09-19若有定义语句int a,b;double x;则下列选项中没有错误是C A)switch(x%2) B) switch((int)x%2.0) {case 0:a;break; {case 0:a;break; case 1:b;break; case 1:b;break; default:a;b; default:a;b; } } C)switch((int)x%2) D)switch((int)(x)%2) {case 0:a;break; {case 0.0:a;break; case 1:b;break; case 1.0:b;break; default:a;b; default:a;b; } } 【解析】switch语句的圆括号中的表达式的值必须是整型或字符型不能为实型。x是double型x%2不合法A项错误。(int)x%2.0不合法B项错误。(int)x%2值为整型故C项正确。case后面的表达式可以是求得整型量和字符型量的常量表达式故D项错误。 例22009-09-18有以下程序 #include stdio.h main() {int c0,k; for(k1;k3;k) switch(k) {default:ck; case 2:c;break; case 4:c2;break; } printf(“%d\n”,c); }程序运行后的输出结果是(A) A)3 B)5 C)7 D)9 【解析】当k1时没有匹配的case执行default语句cck011。继续往下执行case 2后边的语句cc变为2遇到break语句于是退出内层switch结构。当k2时找到匹配的case 2执行c; c变为3遇到break语句于是退出内层switch结构。执行外层循环for结构的kk变为3k3不成立跳出for语句。最后输出结果为3。 l 当switch语句和循环语句for、while时要注意switch里面的break语句退出的位置。解决这一问题的方法是首先划分结构确定循环的语句体包括哪些语句。然后在继续划分循环体内的语句如果循环体内的语句只有一条switch语句其内部出现了break,遇到break要结束当前switch语句的执行继续执行下一次循环。 例12011-03-26有以下程序 main() { int s; scanf(%d,s); while(s0) { switch(s) {case1:printf(%d,s5); case2:printf(%d,s4);break; case3:printf(%d,s3); default:printf(%d,s1);break; } scanf(%d,s); } } 运行时若输入1 2 3 4 5 0回车则输出结果是A A)6566456 B)66656 C)66666 D)6666656 【解析】while循环s0时退出循环输入1 2 3 4 5 0只有当输入0时退出循环switch中当s1时执行case 1case 2由于case 1后面没有break会继续执行case 2遇到break退出switch当s2时执行case 2退出switch当s3时执行case 3default由于case 3后面没有break会继续执行default遇到break退出switch当s4和5时执行default退出switch。所以输入1时输出65输入2时输出6输入3时输出64输入4时输出5输入5时输出6。故选择A。 5.知识点while,do-while,for三种循环结构 例12011-09-20有以下程序 #include stdio.h main() { inta7; while(a--); printf(“%d\n”,a); }程序运行后的输出结果是 (B) A.- 1 B.0 C.1 D.7 【解析】此类题一定要注意标点符号的位置while(a--);该行末尾的分号即为一条空语句来作为while的循环体。 例12010-09-20有以下程序 #include stdio.h main() {int a1,b2; while(a6) {ba;a2;b%10;} printf(“%d,%d\n”,a,b); }程序运行后的输出结果是(B) A)5,11 B)7,1 C)7,11 D)6,1 例22011-03有以下程序段 main() { … while( getchar()!\n); … }以下叙述中正确的是(C) A)此while语句将无限循环 B) getchar()不可以出现在while语句的条件表达式中 C)当执行此while语句时只有按回车键程序才能继续执行 D)当执行此while语句时按任意键程序就能继续执行 【解析】while条件表达式getchar()!\n只要输入的字符不是回车就一直执行循环而循环内是一个空语句所以按回车键程序才能继续执行选择C。 l 循环体部分可以只有一条空语句不做任何操作。 例32010-09-21有以下程序 #include stdio.h main() {int y10; while(y--); printf(“y%d\n”,y); }程序执行后的输出结果是(B) A)y0 B)y-1 C)y1 D)while构成无限循环 【解析】while(y--)后面的分号是一个空语句当y--不等于0时执行空语句当y—等于0时执行printf函数输出y值当y—等于0时退出循环此时y值变成-1。 l 如果第一次判断表达式的值为0则循环一次也不执行。即while循环体最少执行0次。 例42011-03当执行下列程序时输入1234567890CR则其中while循环体将执行 0 次。 #include stdio.h main() {char ch; while((chgetchar()’0’)) printf(‘#’); } 【解析】chgetchar()ch第一次读入的值为’1’故while((chgetchar()’0’))不成立循环一次也不执行。 l while循环与switch结构 例5、2011-03有以下程序 main() { int s; scanf(%d,s); while(s0) { switch(s) {case1:printf(%d,s5); case2:printf(%d,s4);break; case3:printf(%d,s3); default:printf(%d,s1);break; } scanf(%d,s); } } 运行时若输入1 2 3 4 5 0回车则输出结果是(A) A)6566456 B)66656 C)66666 D)6666656 【解析】while循环s0时退出循环输入1 2 3 4 5 0只有当输入0时退出循环switch中当s1时执行case 1case 2由于case 1后面没有break会继续执行case 2遇到break退出switch当s2时执行case 2退出switch当s3时执行case 3default由于case 3后面没有break会继续执行default遇到break退出switch当s4和5时执行default退出switch。所以输入1时输出65输入2时输出6输入3时输出64输入4时输出5输入5时输出6。故选择A。 6.知识点do-while语句 例12009-09-09以下程序运行后的输出结果是 5 。 #include stdio.h main() {int a1,b7; do{ bb/2; ab; }while(b1); printf(“%d\n”,a);} l do-while循环体最少执行1次。 例22007-09若变量已正确定义有以下程序段 i0; do printf(“%d,”,i); while(i); printf(“%d\n”,i); 其输出结果是 B A)0,0 B)0,1 C)1,1 D)程序进入无限循环 【解析】执行do-while循环输出i的值为0接着判断循环条件ii的值为0i的值为1故答案是B。 7.知识点for语句 例12011-03有以下程序 main() { char b,c; int i; ba; cA; for(i0;i6;i) { if(i%2) putchar(ib); else putchar(ic); } printf(\n); } 程序运行后的输出结果是B A)ABCDEF B)AbCdEf C)aBcDeF D)abcdef 【解析】for循环执行6次每次判断i能否被2整除如果不能则输出ib如果可以则输出ic注意if(i%2)是求表达式i%2是否为true即其结果是不是非0。所以i为0时输出0AAi为1时输出1abi为2时输出2ACi为3时输出3adi为4时输出4AEi为5时输出5af。故选B。 l 表达式1、表达式2、表达式3可以缺省但两个分号不能省略。 表达式1省略的情况如下 例22010-03-21有以下程序 #include stdio.h main() {int a1,b2; for(;a8;a) {ba;a2;} printf(“%d,%d\n”,a,b); }程序运行后的输出结果是(D) )9,18 B)8,11 C)7,11 D)10,14 l 表达式1和表达式3也可以是逗号表达式。 例32009-04-20以下程序段中的变量已正确定义 for(i0;i4;i,i) for(k1;k3;k) printf(“*”);程序段的输出结果是 (B) A)******** B)**** C)** D)* 【解析】外层for循环表达式3是逗号表达式即i自加2。. l for循环与switch结构 例42009-09-29有以下程序 #include stdio.h main() {int a[]{2,3,5,4},i; for(i0;i4;i) switch(i%2) {case 0:switch(a[i]%2) {case 0:a[i];break; case 1:a[i]--; }break; case 1:a[i]0; } for(i0;i4;i) printf(“%d”,a[i]); printf”\n”; }程序运行后的输出结果是(C) A)3 3 4 4 B) 2 0 5 0 C)3 0 40 C)0 3 0 4 例5、2011-03有以下程序段 int i,n; for(i0;i8;i) { nrand()%5; switch (n) { case1: case 3:printf(%d\n,n);break; case 2: case 4:printf(%d\n,n);continue; case 0:exit(0); } printf(%d\n,n); } 以下关于程序段执行情况的叙述正确的是D A)for循环语句固定执行8次 B)当产生的随机数n为4时结束循环操作 C)当产生的随机数n为1和2时不做任何操作 D)当产生的随机数n为0时结束程序运行 【解析】rand()是随机产生一个整数rand()%5即随机得到0-4这五个数字for循环控制随机产生8次当得到13时执行printf(%d\n,n)并退出switch当得到24时执行printf(%d\n,n)并继续循环当得到0时exit(0)正常结束程序。所以循环不一定执行8次故选择D。 l for循环与数组 例62010-09-09有以下程序 #include stdio.h main() {int i,n[]{0,0,0,0,0}; for(i1;i4;i) {n[i]n[i-1]*31 printf(“%d ”,n[i])} }程序运行后的输出结果是 1 4 13 40 。 l 注意区 赋值语句和判断语句 例 72011-03若i和k都是int类型变量有以下for语句 for(i0,k-1;k1;k) printf(*****\n); 下面关于语句执行情况的叙述中正确的是 D A)循环体执行两次 B)循环体执行一次 C)循环体一次也不执行 D)构成无限循环 【解析】for循环的表达式1和表达式3可以是一个简单的表达式也可以是逗号表达式本题表达式1是一个逗号表达式i赋值为0同时k赋值为-1。所以判断表达式2k1是k赋值为1故无限循环选择D。 8.知识点循环嵌套 例12010-03-20有以下程序 #include stdio.h main() {int i,j,m1; for(i1;i3;i) { for(j3;j0;j--) {if(i*j3) break; m*i*j; } } printf(“m%d\n”,m); }程序运行后的输出结果是 A A)m6 B)m2 C)m4 D)m5 例22011-03有以下程序 main() { int x1,y0; if(!x) y; else if(x0) if (x) y2; else y3; printf(%d\n,y); }程序运行后的输出结果是(D) A)3 B)2 C)1 D) 0 【解析】if-else的嵌套注意else总是与前面最近的且未配对的if语句配对组合。if(!x)中x为1x为0为false即if(!x) 后的语句不执行else if(x0)x为1也不等于0也不成立故else if内的语句也不执行而if (x) y2;else y3;均为else if内的语句。所以直接输出y为0故选D。 9.知识点break语句 l 功能跳出整个switch语句跳出循环体防止死循环。 l break语句只能出现在switch、while、do-while、for循环中不能出现在其他地方。 l 作用范围所在循环体从属的最内层循环而不是外层的某个循环。 6.知识点continue语句 l 功能结束本次循环接着判断是否继续下一次循环。 l continue语句只能出现在while、do-while、for循环中。 l 作用范围所在循环体从属的最内层循环而不是外层的某个循环。 例12009-04-09以下程序运行后的输出结果是 s0 #include stdio.h main() {int k1,s0; do{ if((k%2)!0) continue; sk; k; }while(k10); printf(“s%d\n”,s); } 【解析】k1if((k%2)!0)条件成立执行continue语句结束本次循环判断表达式k10值为0故跳出do-while循环执行printf(“s%d\n”,s);则输出结果为s0。 第三课 数组 本课重要知识点 1.知识点一维数组的定义 例12010-03-25下列选项中能正确定义数组的语句是D A)int num[0…2008]; B)int num[]; C)int N2008; D)#define N 2008 int num[N]; int num[N]; 【解析】数组的长度必须是一个整型常量、整型常量表达式故A项错误。定义数组时不能省略数组长度B项错误。数组的长度不能是变量C项错误。数组的长度可以是符号常量D项正确。 例2(2010-09-28)若要定义一个具有5个元素的整型数组以下错误的定义语句是D A)int a[5]{0}; B)int b[]{0,0,0,0,0}; C)int c[23]; D)int i5,d[i]; 【解析】可以只给数组的前面一部分元素设定初值A项正确。对全部数组元素赋初值时可以不指定数组元素的个数B项正确。数组的长度可以是一个整型常量表达式C项正确。数组的长度不能是变量D项错误。 2.知识点一维数组元素的引用 例1(2008-09-21)若有定义语句int m[]{5,4,3,2,1},i4;则下面对m数组元素的引用中错误的是 C A)m[--i] B)m[2*2] C)m[m[0]] D)m[m[i]] 【解析】m数组元素的引用的下限为0上限为4。i4--i的值为3A项正确。B项没有越界正确。m[0]5超过上限已经越界故C项错误。m[4]1没有越界故D项正确。 例2(2011-03)以下程序运行后的输出结果是 13715 main() { int i,n[5]{0}; for(i1;i4;i) { n[i]n[i-1]*21; printf(%d,n[i]); } printf(\n); } 【解析】n[1]1,n[2]1*213,n[3]3*217,n[4]7*2115 3.知识点一维数组的初始化 l 顺序列出数组元素的全部初值例如inta[5]{1,2,3,4,5}; l 只给数组的前面一部分元素设定初值未赋初值的元素自动取0值。例如int a[5]{1,2}; l 对全部数组元素赋初值时可以不指定数组元素的个数。例如inta[]{1,2,3,4,5}; 4.知识点二维数组的初始化 l 按行分段给二维数组赋初值 l 按行连续赋值 l 对部分元素赋初值未赋初值的元素自动取0值 l 若对全部元素赋初值则第一维的长度可以不指定 例12006-04-16以下数组定义中错误的是B A) int x[][3]{0}; B) intx[2][3]{{1,2},{3,4},{5,6}}; C) int x[][3]{{1,2,3},{4,5,6}}; D) int x[2][3]{1,2,3,4,5,6} 【解析】若对全部元素赋初值则第一维的长度可以不指定C项正确。二维数组的初始化可以按行连续赋值D项正确。C项二维数组的初始化超过第一维度长度故错误。 5.知识点二维数组和for语句 例12010-03-09有以下程序 #include stdio.h main() {int i,j,a[][3]{1,2,3,4,5,6,7,8,9}; for(i0;i3;i) for(ji;j3;j) printf(“%d”,a[i][j]); printf(“\n”); }程序运行后的输出结果是 123569 。 6.知识点字符串 定义由“”引起来的由若干个字符所组成的序列。 字符串的结束标志’\0’ 如字符串“china”在内存中存储形式是 c h i n a \0 该字符串的长度为5字节所占的存储空间为6字节。 7.知识点字符数组的定义及初始化 l 字符数组名是地址常量不能赋值给数组名。 例12009-04-32以下选项中正确的语句组是 A)char s[];s”BOOK!”; B)char *s;s{“BOOK!”}; C)char s[10];s”BOOK!”; D)char *s;s”BOOK!”; 【解析】字符数组名是地址常量不能赋值给数组名故A、C项错误D项指针s是个变量将字符串常量赋值给s是正确的。B项中给s赋值时不能用花括号将字符串括起来。 例22009-09-31下面是有关C语言字符数组的描述其中错误的是D A)不可以用赋值语句给字符数组名赋字符串 B)可以用输入语句把字符串整体输入给字符数组 C)字符数组中的内容不一定是字符串 D)字符数组只能存放字符串 8.知识点字符数组的输入与输出 例12009-09-13有以下程序 #include stdio.h main() {char a[20]”How are you?”,b[20]; scanf(“%s”,b);printf(“%s %s\n”,a,b); }程序运行时从键盘输入Howare you?回车 则输出结果为How are you? How 【解析】scanf函数输入以空格作为字符串输入结束的标志故字符数组b只接收到字符串”How”。 例22011-03有以下程序 main() { char a[30],b[30]; scanf(%s,a); gets(b); printf(%s\n%s\n,a,b); }程序运行时若输入howare you? I am fine回车则输出结果是B A)how are you? B)how I amfine are you?I am fine C)how are you? I am fine D)row are you? 【解析】scanf以空格作为字符串输入结束的标志而gets(s)不会。所以a得到的是“how”b得到的是剩下的“are you? I am fine”。故选择B。 例32011-03有以下程序 main() { chars[]012xy\08s34f4w2; inti, n0; for(i0;s[i]!0;i) if(s[i]0s[i]9) n; printf(%d\n,n); } 程序运行后的输出结果是 (B) A)0 B)3 C)7 D)8 【解析】for循环读取字符数组s中的字符当读到0时退出循环注意0和‘0’的区别字符‘0’的ASCII码为48‘\0’的ASCII 码才是0所以读取的字符为“012xy”中的字符for循环读取到字符后判断是不是数字字符如果是n自增1“012xy”中的数字字符只有三个所以选择B。 9.知识点字符串处理函数 例1(2011-09-32)有以下程序 #includestdio.h #includestring.h main() { chara[5][10]{“china”,”beijing”,”you”,”tiananmen”,”welcome”}; int i,j; char t[10]; for(i0;i4;i) for(ji1;j5;j) if(strcmp(a[i],a[j])0) { strcpy(t,a[i]); strcpy(a[i],a[j]); strcpy(a[i],t);} puts(a[3]); }程序运行后的输出结果是 (C) A.beijing B.china C.welcome D.tiananmen 【解析】双层for循环部分是典型的排序方法通过strcmp比较两个字符串的大小然后借助t数组作为中转数组通过strcpy函数完成a[i]和a[j]两个字符串的交换使a数组按从小到大排序即{”beijing” , “china” , ”tiananmen”,”welcome”,”you” } 例1(2010-09-23)有以下程序 #include stdio.h #include string.h main() {char x[]”STRING”; x[0]0;x[1]’\0’;x[2]’0’; printf(“%d %d\n”,sizeof(x),strlen(x)) }程序运行后的输出结果是B A)6 1 B)7 0 C)6 3 D)7 1 【解析】经过x[0]0;x[1]’\0’;x[2]’0’;后x[]”0\00ING”。strlen测字符串的实际长度不含字符串结束标志’\0’故strlen(x)为0。sizeof测字符串所占的存储空间包含字符串结束标志故sizeof(x)为7。 例2(2010-09-33)有以下程序 #include stdio.h #include string.h main() {char a[20]”ABCD\0EFG\0”,b[]”IJK”; strcat(a,b); printf(“%s\n”,a); }程序运行后的输出结果是(B) A)ABCDE\0FG\0IJK B)ABCDIJK C)IJK D)EFGIJK 【解析】把字符数组b中的字符串连接到字符数组a中字符串的后面并删去字符串a后的第一个字符串结束标志’\0’。故输出结果为ABCDIJK。 例3 (2010-09-31)下列选项中能够满足“若字符串s1等于字符串s2则执行ST”要求的是 (A) A)if(strcmp(s2,s1)0)ST; B)if(s1s2)ST; C)if(strcpy(s1,s2)1)ST; D)if(s1-s20)ST; 【解析】若字符串s1等于字符串s2strcmp(s2,s1)0故答案是A。 第四课 指针 本课重要知识点 1.知识点指针的概念与指针变量 l 指针就是地址。指针变量是用来存储地址而一般变量是用来存储数值。 例1.(09-09-26)有如下程序输出结果为 1221 #include stdio.h main() { int m1,n2,*pm,*qn,*r; rp ;pq ;qr ; printf(“%d,%d,%d,%d\n”,m,n,*p,*q) ; } 【解析】p、q为指针初始化时p指向mq指向n。执行rp ;pq ;qr ;p和q的值交换从而p指向nq指向m。指针的改变不会应用m、n的值最后输出*p和*q的值分别为n、m的值。 2.知识点指针的引用 l 指针的引用是通过两个运算符实现“”和“*”实现的 是取地址符号它的一半格式是变量名。例如int i ; i表示取i的地址。 *是取值运算符它的一般格式*指针变量名。例如:inti10,*pi; *p表示取i的值10 例1.(2011-09-25)若定义语句intyear2009,*pyear;,以下不能使变量year中的值增至2010的语句是 D A.*p1; B.(*p); C.(*p); D.*p; 【解析】*和同级别按自左向右的结合方向因此D选项可转变为*p从而只是使指针发生移动而不能将p所指变量增1 例2.(06—04—24)若有说明语句double *pa则能通过scanf语句正确给输入项读入数据的程序段是 (D) A)*pa scanf(lfp) B)*pa scanf(fp) C)pa scanf(lf*p) D)pa scanf(lfp) 【解析】对于scanf函数输入数据列表必须是合法地址表达式(可以使地 址常量、指针)A选项、B选项*使用错误。 例3.(09-03-16)若有定义语句 doule x,y,*px,*py;执行了pxx;pyy;之后正确的输入语句是(C) A) scanf(f%f,x,y); B) scanf(f%fx,y); C)scanf(f%le,px,py); D) scanf(lf%lf,x,y); 【解析】A,D选项中的x,y缺少取地址符B项中x之前缺少逗号格式不正确。 3.知识点指针变量的初始化 l 指针变量在使用前必须要初始化把一个具体的地址赋给它否则引用时会出错如果不指向任何数据就赋“空值”NULL。 l 指针变量两种初始化方法方法一int a2*pa(定义的同时初始化) 方法二int a2*ppa(先定义后初始化) 例1.(07—04—29)设已有定义float x则以下对指针变量P进行定义且赋初值的语句中正确的是 (D) A)float *p1034 B)int *p(float)x C)float px D)float *px 【解析】可以给一个指针赋值的只能是一个与该指针同类型的指针(或地址值)故A、B选项错误C选项声明指针出错P前面的指针说明符*不能省略。 4.知识点指针的运算 l *p和(*p)之间的差别*p是地址变化(*p)是指针变量所指的数据变化。一个指针变量加一个整数不是简单的数学相加而是连续移动若干地址。当两个指针指向同一数组时它们可以比较大小进行减法运算。 例如int a[10],*p; pa; p;表示p移动一个存储单元p指向a[1]只有当指着指向数组元素时指针的运动才有意义。 5:知识点指针与数组 l 指针与一维数组 数组名代表数组的首地址。一维数组中第一个元素的地址即为该数组的起始地址。建立指针变量与一维数组的联系 例如 inta[6],*pa; paa;或paa[0]; 说明①数组名a代表该数组的首地址也即a[0]的地址。 ② paa;或paa[0];使pa保存了数组a的首地址pa,a,a[0]都指向一个地址。 ③以上操作可等价于 int a[6],*paa; ④如果paa[3]表示*pa的值就是a[3]的地址。 注意数组a是一个地址常量它永远指向数组的首地址不能重新赋值。因此 ai;或a都是错误的。 例1.(08—04—23)有以下程序 #includestdioh main() {int a[]{12,3,4)y*pa[3] --py*pprintf(yd\n,y) } 程序的运行结果是D A)y0 B)yl C)y2 D)y3 【解析】程序中定义一个一维数组并初始化再一定义了一变量和一个指针(将指针指向数组下标为3的一个元素)执行--p(注意当指针指一个元素后指针变量加上“*”时表示引用的是元素的值当不加“*“时表示引用的是地址)向前移动一个位置指向a[2]yp(将p指针指向的值3赋给变量y)输出y的值为3。 例2.(11-03-24)设有定义double x[10],*px;以下能给数组x下标为6的元素读入数据的正确语句是 C A)scanf(%f,x[6]); B)scanf(%lf,*(x6)); C)scanf(%lf,p6); D)scanf(%lf,p[6]); 【解析】数组名是数组的首地址px指针p指向数组的首地址要表示数组x下标为6的元素的地址可以有x[6],x6p6p[6],scanf后面的参数列表必须是地址列表B中*x6D中p[6]都是取数组x下标为6的元素的值A中格式控制符%f与double类型不匹配所以选C。 6.知识点用指针访问数组元素 l 通过指针引用数组元素 例如int*p,a[5]; pa[0]; 说明①指针变量p指向了数组元素a[0]可以使用访问运算符“*”来引用变量a[0]; 例*p18;等价于a[0]18; ②*p1表示a[1] p1表示a[1] l 通过数组的首地址引用数组元素 例如int a[5] 说明①a是数组名表示收地址可以把a当做一个指针常量。 ②*a等价与a[0]*(a1)等价与a[1]a等价于a[0]a1等价与a[1]; l 用带下标的指针变量引用一维数组元素 例如int*p,a[5]; pa; 说明①p[0]表示p指针指向的内存单元p[1]表示p指向的内存单元 ②a[i]的等价引用方法a[i]、p[i]、*(ai)、*(pi) ③a[i]的地址等价引用方法a[i]、p[i]、ai、pi 例1.(09-03—29)若有以下定义 int x[10]*ptx 则对x数组元素的正确应用是 B A)*x[10] B)*(x3) C)*(pt10) D)pt3 【解析】引用数组元素时注意取地址运算符与指针运算符t的作用指针运算符用来取得指针变量所指存储空间的内容取地址运算符用来取得变量的地址值A选项数组下标越界B选项中(x3)等价于元素X[3]C选项中。(pt10)等价于x[10]数组下标越界D选项pt3是元素x[3]的地址与x[3]等价故正确答案是B。正确答案B 例1.(2011-09-27)有以下程序 #include stdio.h void fun(int *p) {printf(“%d\n”,p[5]);} main() {int a[10]{1,2,3,4,5,6,7,8,9,10}; fun(a[3]); }程序运行后的输出结果是 D A.5 B.6 C.8 D.9 【解析】fun函数被调用时将a[3]通过传递付给了形参指针变量p此时可用*p或p[0]来表示a[3]因此p[5]亦可表示a[8]所以输出结果为9 7.知识点指针与二维数组 l 任何一个二维数组均由若干个一维数组组成a[0]、a[1]和a[2]是一维数组名数组名代表数组的首地址因此a[0]就代表数组元素a[0][0]的地址也即a[0][0]。 注意a的值与a[0]相同但它们的基类型不同,a可以等价于一个二维指针而a[0]是一维指针。因此 int a[3][4],*pa错误 取数组元素a[i][j]的地址的几种方法a[i][j]a[i]j *(ai)j l 指针数组的定义方式 *指针数组名[常量表达式];如int *p[3]; l 行指针的一般定义形式如下 类型名*指针数组名[常量表达式]; 如int (*p)[2]; l 指针数组与行指针的区别 1、int *p[3]定义的是指针数组表示一个数组含有3个元素p[0]、p[1]、p[2]且这3个元素只能存放整型元素的地址 2、int (*p)[3];定义的是行指针表示一个指针变量它仅有一个存储空间只能存放一个长度为2的一维数组指针。 例1.(06—09—33)若有定义语句int k[2][3]*pk[3]则以下语句正确的是(B) A)pkk B)pk[0]k[1][2] C)pkk[0] D)pk[1]k; 【解析】题目中定义了一个二维数组和一个指针数组pk是指针数组名不能被赋值指针数组pk中的元素是指针并且二维数组名是指向一维数组的指针常量相当于行指针二者不可转换所以A、C、D选项均有误本题答案选B。 例2.(09-09-27) 若有定义语句: int a[4][10],*p,*q[4];且0i4,则错误的赋值是 (A) A)pa B)q[i]a[i] C)pa[i] D)pa[2][1] 【解析】p为基类型为int的指针指向一个整形数据也就可以指向一个数组元素所以D正确。指针数组q的每个数组元素q[i]的基类型也为int所以p、a[i]、a[i]的基类型一致选项B、C也是正确的。 8.知识点指针与函数 例1.(08—04—40)设有定义语句int(*f)(int)则以下叙述正确的是__B_______。 A)f是基类型为int的指针变量 B)f是指向函数的指针变量该函数具有一个int类型的形态 C)f是指向int类型一维数组的指针变量 D)f是函数名该函数的返回值是其类型为int类型的地址 【解析】在c语言中函数名代表此函数的入口地址所因此可以定义一种指向函数的指针来存放函数的入口地址定义方式是函数返回值类型(*函数指针名)(参数类型列表)本题答案选B。 9.知识点指针与字符串 l 可以通过字符指针来处理字符串 例如char *pChina或者char *p;pChina;把字符串赋值给指针p实质是把保存字符串China的那段内存的首地址赋值给指针p使得指针p指向了字符串这样就可以通过指针来操作字符串了。 【注意】char str[10] ; strChina;是错误的数组名是地址常量不能进行赋值操作 l “三名主义”考试的重点 数组名表示第一个元素的地址。数组名是地址常量名不能进行赋值和自加减等运算。考了很多次 函数名表示该函数的入口地址。 字符串常量名表示第一个字符的地址。 例11.(2011-09-22)有以下程序注字符a的ASCII码值为97 #include stdio.h main() { char *s{“abc”}; do {printf(“%d”,*s%10);s;} while(*s); }程序运行后的输出结果是 B A.abc B.789 C.7890 D.979898 例11.(2011-09-30)若有定义语句char*s1”OK”;*s2”ok”;,以下选项中能够输出“OK”的语句是 D A.if(strcmp(s1,s2)0) puts(s1); B.if(strcmp(s1,s2)!0) puts(s2); C.if(strcmp(s1,s2)1) puts(s1); D.if(strcmp(s1,s2)!0) puts(s1); 【解析】strcmp函数作为字符串比较函数当s1等于s2所指字符串时结果为0当s1大于s2所指字符串时结果为 0当s1小于s2所指字符串时结果为 0 例11.(07—04—44)有下列程序 main() {char ch[]“uvwxyz”*pc pcchprintf(”cn”*(pc5)) } 程序运行后的输出结果是(A) A)Z B)0 C)元素ch[5]的地址 D)字符Y的地址 【解析】指针P指向了字符数组ch*(pc5)--ch[5]--’z’printf函数要求以c形式输出故输出字符Z。 例12.09-09-37设有定义char *c;.以下选项中能够使字符型指针c正确指向一个字符串的是(A) A)char str[]”string”; cstr; B)scanf(“%s”,c); C)cgetchar(); D)*c”string”; 【解析】选项A为正确用法。先将字符串存于字符数组中然后将数组名赋给字符指针。选项B为无语法错误但运行时可能会出现问题。原因是字符指针没有被赋值是一个不确定的值指向一个不确定的内存区域这个区域可能存放有用的指令或数据。在这个不确定的区域重新存放输入的字符串可能会发生无法预知的错误。选项C错误。getchar()函数输入一个字符给字符型变量而不应该是字符指针。选项D错误。*c”string”应该改为c”string”才是正确的。 第五课 函数 本课重要知识点 1、知识点函数的概述 l 源程序是由函数组成的函数由函数首部与函数体组成函数体包括声明部分和执行语句部分组成。 l 语言程序可以由多个源程序组成其中一个源程序文件包含main函数其他函数可以写在另外的源程序文件中为单独文件并且可以单独编译。 例110-03-11以下叙述正确的是 B A)C语言程序是由过程和函数组成的 B)C语言函数可以嵌套调用例如fun(fun(x)) C)C语言函数不可以单独编译 D)C语言中除了main函数其他函数不可以作为单独文件形式存在 【解析】选项A错误C语言中没有过程的概念选项B正确C语言可以嵌套调用此知识点在后面介绍选项C错误C语言中可以对包含一个或多个函数的源程序单独编译选项D错误C语言函数可以单独存在。 l 程序的执行总是从main函数开始完成对其它函数的调用后再返回到main函数最后由main函数结束整个程序。main 函数可以调用其它函数而不允许被其它函数调用。一个源程序必须有也只能有一个主函数main。 例1下列叙述中正确的是 C A)C语言程序将从源程序中第一个函数开始执行 B)可以在程序中由用户指定任意一个函数作为主函数程序将从此开始执行 C)C语言规定必须用main作为主函数名程序将从此开始执行在此结束 D)main可作为用户标识符用以命名任意一个函数作为主函数。 l 在一个函数的函数体内不能再定义另一个函数即不能嵌套定义。 例1、下列叙述中正确的是 D A)每个C程序文件中都必须要有一个main()函数 B)在C程序中main ()函数的位置是固定的 C)C程序中所有函数之间都可以是固定的 D)在C程序的函数中不能定义另一个函数 【解析】一个C源程序可以由多个C程序文件但只能有一个main()函数并不是每个C程序文件都必须要有一个main()main()函数可以放在任意位置且不允许被其他函数调用因此正确答案是D。 2、知识点函数的定义 例1以下正确的函数定义形式是C A)double fun(int x,int y);{} B double fun(int x ;inty){} C) double fun(int x,int y){} D) double fun(int x, y);{} 【解析】在函数中对形参的说明要求对每个形参都必须说明类型各参数之间用“,间i;le fun(intx,int y); D)”隔开函数定义后应无“”。 l 函数返回return语句的一般形式return 表达式或return (表达式) 在函数中允许有多个return语句但每次只能有一个return语句被执行。 例110-03-24以下关于return语句叙述中正确的是 B A一个自定义函数中必须有一条return语句 B一个自定义函数中可以根据不同情况设置多条return语句 C定义void类型的函数中可以有带返回值的return语句 D没有return语句的自定义函数在执行结束时不能返回到调用处。 【解析】自定义函数中可以没有return语句如不需要返回值的函数常见void类型可以有多条return语句如在分支结构中可以从不同分支中返回到调用程序常见if..else定义成void类型的函数不允许从该函数取得返回值也不允许使用return语句。没有return语句的函数在执行到函数的最后一条语句后自动返回达到调用处。 Ø 函数值的类型与函数定义中函数的类型保持一致如不一致以函数类型为准。 例2(06-04-23)已定义以下函数 intfun(int *p){return *p} fun函数返回值是 B A)不确定的值 B)一个整数 C)形参P中存放的值 D)形参P的地址值 【解析】函数返回性类型取决于定义函数时函数名称前的类型fun前是int表明函数fun执行完毕后返回一个整型数。正确答案B Ø return 后的表达式可以是常量、变量、表达式也可以空。 如return ; return 0; return a; return (ab); 3、知识点形参和实参及函数调用 l 形参出现在函数定义中即定义函数时函数名后面括号中的参数实参出现在主调函数中调用函数时函数名后面括号中的参数 l 形参在本函数体内都可以使用离开该函数则不能使用。实参在主调函数中内有效进入被调函数后实参变量也不能使用。注在进行函数调用时函数必须有确定的值 l 实参向形参单向传递数值不能将形参的值反向的传送给实参。实参和形参在数据上、类型上、顺序上要一致。在函数调用过程中形参的变化不会改变实参的变化。 例1、09-09-24有以下程序 #includestdio.h void fun(int p) { int d2; pd;printf(“%d”,p); } main() { int a1; fun(a); printf(“%d\n”,a); } 程序运行后的输出结果是 C A) 32 B)12 C)21 D)22 【解析】此题考点为函数参数的传递。C语言中函数参数的传递是值传递是把实参的值传给形参是单向传递形参的改变不会影响到实参的值。程序中把实参a的值传给形参pp1然后pd再次赋值后p2输出p的值2。返回到主程序中输出a的值为1。形参p的改变不会影响到实参a的值a的值仍为1.因此答案为C. l 在传递数值时形参和实在分别占据不同的存储单元形参变量只有在被调用时才分配内存单元调用结束后即刻释放分配的内存单元 例1、(07-04-25)若函数调用时的实参为变量时以下关于函数形参和实参的叙述中正确的是 D A)函数的实参和其对应的形参共占同一存储单元 B)形参只是形式上的存在不占用具体存储单元 C)同名的实参和形参占同一存储单元 D)函数的形参和实参分别占用不同的存储单元 【解析】本题考点是函数的参数定义在函数中主调数中里边的参数叫做实参而被调函数里边的参数叫做形参当函数传递时传递的是值它们占用的不是同一存储单元而且在传递中是单向传的由实参传向形参。 l “传值”与“传址”的区别传数值的话形参的变化不会改变实参的变化。传地址的话形参的变化就有可能改变实参所对应的量。 例110-03-26有以下程序 #include stdio.h void fun(char *c,int d) { *c*c1; dd1; printf(“%c,%c”,*c,d); } main() { char b’a’, a’A’; fun(b,a); printf((“%c,%c\n”,b,a); } 程序运行后的输出结果是(A) A) b,B,b,A B)b,B,B,A C)a,B,B,a D)a,B,a,B 4、知识点函数调用的一般形式和调用方式 l 函数调用的一般形式为函数名实际参数表 实参可以是常数、变量或其他构造类型数据及表达式也可以没有当为无参函数时 l 函数调用的方式 1函数表达式函数作为表达式中的一项出现在表达式中以函数返回值参与表达式运算。例如zmax(x,y) 2函数语句函数调用的一般形式上加上分号。例如printf(“%d\n”,a); 3函数实参函数作为另一个函数调用的实际参数出现。例如printf(“%d”,max(x,y)); l 程序从main函数进入上往下执行当碰到函数名后把值传给调用函数当程序得到了返回值或调用函数结束再顺序往下执行最后到main函数结束。 5、知识点函数的声明及其位置 l 函数要“先定义后调用”或“先声明再调用后定义”。函数的声明一定要有函数名、函数返回值类型、函数参数类型但不一定要有形参的名称。 一般形式为 类型说明符被调函数名(类型形参类型形参…) 或 类型说明符被调函数名(类型类型…) 注意其末尾“”不能省 例如int max(int a,int b); 或 int max(int ,int); 两者功能相同 例1、(06-09-32)若有以下函数首部 int fun(double x[10]int *n) 则下面针对此函数声母语句中正确的是D A)int fun(double xint *n) B)int fun(doubleint) C)int fun(double*xint n) D)int fun(double *int。) 【解析】本题考点是对函数的声明在函数声明的时候,其格式如下返回值类型函数名(参数类型[参数名]参数类型[参数名]……)其中参数名可以不写但是参数类型一定要写全 l 省去主调函数中对被调函数的函数说明的几种情况 1被调函数的返回值是整型或字符型时返回值自动按整型处理 2当被调函数的函数定义在主调函数之前时 3在所有函数定义之前在函数外预先说明了各个函数的类型 例210-09-24有以下程序 #includestdio.h int f(int x); main() { int n1,m; mf(f(f(n))); printf(“%d\n”,m); } int f(intx) { returnx*2;} 程序运行的输出结果( D ) A) 1 B)2 C)4 D)8 【解析】f函数定义在main下面但在外部进行声明int f(int x);因此在main中可直接调用。 三次调用函数:f(n)f(1)2 f(2)4 f(4)8 mf(f(f(n)))f(f(f(1)))f(f(2))f(4)8 例311-03-12有以下程序请在 【12】处填写正确语句使程序可正常编译运行。 【12】; main() { doublex,y,(*p)(); scanf(%lf%lf,x,y); pavg; printf(%f\n,(*p)(x,y)); } double avg(double a,double b) { return((ab)/2);} 答案double avg(double a,doubleb);或double avg(double ,double ); 【解析】当函数定义在调用之后调用前必须对函数进行申明申明的形式和函数定义中的函数头部分相同最后加分号即可。 6、知识点函数的嵌套调用 l C语言中不允许作嵌套的函数定义但是允许在一个函数的断定仪中出现对另一个函数的调用即嵌套调用。 例106-04-33有以下程序 intfunl(double a){return a*a} int fun2(double xdouble y) {double a0b0 afunl(x)bfunl(y)return (int)(ab) } main() {double wwfun2(1.1,2.0)……} 程序执行后变量w中的值是( C ) A)5.2l B)5 C)5.0 D)0.0 【解析】此题考查函数的嵌套调用。main函数中调用了fun2函数fun2函数中又调用了如fun1函数wfun2(1.1,2.0)--w(int)(funl(1.1)funl(2.0))àw(int)5.21w值为5但是w是double类型变量故将5转换成50赋值给变量w 例2、09-3-24有以下程序 #includestdio.h int f(int x,int y) {return ((y-x)*x);} main() { int a3,b4,c5,d; df(f(a,b),f(a,c)); printf(“%d\n”,d); } 程序运行后的输出结果是 B A) 10 B)9 C)8 D)7 【解析】程序的main()函数中定义了4个变量前3个分别初始化D用来接收调用函数后返回的值主函数一共调用了3次f()函数第一次传递a,b的值给形参x,y返回y-x*x的值为3第二次将a,c的值传递给形参x,y返回y-x*x的值为6接着将fa,bf(a,c)的值3、6传递给形参,执行后返回值9赋值变量d最后输出结果为9 7、知识点函数的递归调用 l 函数直接或间接地调用自己称为函数的递归调用。递归调用必须有一个明确的结束递归的条件。在做递归题时可把递归的步骤一步步写下来不要弄颠倒了。 例1、(04-09-37)在函数调用过程中如果函数funA调用了函数funB函数funB又调用了函数funA则 B A)称为函数的直接递归调用 B)称为函数的间接递归调用 C)称为函数的循环调用 D)C语言中不允许这样的递归调用 【解析】此题考查函数递归的基本概念。一个函数直接或间接调用自己称为函数的递归调用若直接调用了自己则称为直接递归调用若间接调用了自己则称为间接递归调用根据间接递归调用的概念可知本题中的函数调用为间接递归调用。 例2、09-09-15 #include stdio.h fun(int x) { if(x/20) fun(x/2); printf(“%d ”,x); } main() { fun(6); printf(“\n”);}程序运行后的输出结果是__1 3 6______ 【解析】程序的执行过程是先递推、后递归的过程。当x1时条件不成立递推终止。程序执行流程参照示意图。 例310-03-33有以下程序 #include stdio.h int f(int t[],intn); main() { int a[4]{1,2,3,4},s; sf(a,4); printf(“%d\n”,s); } int f(int t[],int n) { if(n0)return t[n-1]f(t,n-1); elsereturn 0; }程序运行后的输出结果是 B A) 4 B) 10 C)14 D)6 【解析】sf(a,4)t[3]f(a,3)4f(a,3)4t[2]f(a,2)43f(a,2)7t[1]f(a,1) 72f(a,1)9t[0]f(a,0)91f(a,0)10010 例411-03-32设有如下函数定义 int fun(int k) { if(k1) return 0; else if(k1) return 1; else return fun(k-1)1; }若执行调用语句nfun(3);则函数fun总共被调用的次数是( B) A)2 B)3 C)4 D)5 【解析】递归调用fun(3)— fun(2)— fun(1) ;fun(1)—1— fun(2)—2— fun(3)—3—n所以fun总共被调用的次数是3最后n为3。 例511-03-34有以下程序 int fun (int x,int y) { if(x!y) return ((xy)/2); else return (x); } main() { inta4,b5,c6; printf(%d\n,fun(2*a,fun(b,c))); }程序运行后的输出结果是( B) A)3 B)6 C)8 D)12 【解析】函数递归调用fun(8,fun(5,6)),其中fun(5,6)因为5!6, return ((xy)/2)为5所以fun(8,fun(5,6))为fun(8,5)8!5, return ((xy)/2)为6 8、知识点局部变量和全局变量 l 在一个函数内部或复合语句内部定义的变量它只在本函数范围内有效也就是说只有在本函数内才能使用它们在函数以外是不能使用这些变量的。这称为局部变量局部变量又称为内部变量。函数的形参也属于局部变量。 l 在函数外部定义的变量称为全局变量又称为外部变量。全局变量可以被本文件的其他函数所共用。 例1、(07-09-40)在一个C语言源程序文件中所定义的全局变量其作用域为D A)所在文件的全部范围 B)所在程序的全部范围 C)所在函数的全部范围 D)由具体定义位置和extem说明来决定范围 【解析】本题考点是全局变量的作用域全局变量的作用域是从变量定义开始一直到程序程结束为止当然也可以在其它文件中用这个以定义的全局变是但是要通过extern来进行声明本题答案选D。 例2、(09-09-11)有以下程序 #includestdio.h int a5; void fun(int b) { int a10; ab; printf(“%d”,a) } main() { int c20; fun(c); ac; printf(“%d\n”,a); }程序运行后的输出结果是____3025____ 【解析】全局变量的作用域为定义开始到文件结束。局部变量的作用域为定义其函数内部。当局部变量与全部变量同名时在局部变量作用域内全部变量不起作用。 执行函数fun(c): 实参c 将值传给形参b即b20函数内部定义局部变量a起作用,a10,ab aab102030输出a的值为30 返回到主函数 ac 此时a为全局变量的值 aac52025 输出a值25 注意格式控制符无空格所以连续输出 9知识点变量存储类别auto变量、register变量、static变量 Ø 静态变量static 1在编译时分配存储空间所占存储单元直到程序结束时才释放它的值在程序运行过程中一直存在且变量的初始化只进行一次。 2static说明符可以用于全局变量也可用于局部变量auto和resgiter不可以定义全局变量但是当它说明变量后只要这个变量还在程序中存在那么不管用到还是没有用到它都将会占用内存单元。 例110-09-36有以下程序 #include stdio.h int f() { static int x1; x1; return x; } main() { int i,s1; for(i1;i5;i)sfun(); printf(“%d\n”,s); } 程序运行后的输出结果是( B) A)11 B)21 C)6 D)120 【解析】fun函数被调用了5次每次调用后的值返回值累加到s上。 第一次静态局部变量定义有效x2,返回值为2。ssfun()123;从第2次调用开始静态局部变量的定义相当于不存在直接使用x的值。 第二次x3 s336 第三次x4 s6410 第四次x5 s10515 第五次x6 s15621 例211-03-34有以下程序 int fun() { staticint x1; x*2; return x; } main() { inti,s1; for(i1;i3;i)s*fun(); printf(%d\n,s); }程序运行后的输出结果是D A)0 B)10 C)30 D)64 【解析】静态变量static类型在函数执行完后空间并不释放而且只初始化一次。所以第一次调用后x的值为2返回后s的值为2第二次调用后x的值为2*24返回后s的值为2*48第三次调用后x的值为4*28返回后s的值为8*864故选D。 Ø 自动变量auto 1自动变量的存储空间是当程序执行到定义它的函数或语句块时才分配当函数执行结束后自动释放变量的值也就不再存在。 2局部变量的存储类别默认为auto可以省略不写但它不能定义全局变量。 Ø 寄存器变量register 例1、(08-04-39)在C语言中只有在使用时才占用内存单元的变量其存储类型是 A 。 A)auto和register B)extern和register C)auto和static D)static和register 【解析】auto变量在进入函数体时系统为其分配存储单元退出时自动释放register是建议编译程序将变量的值保存在cpu的寄存器中而不是占用内存单元extern可以对全局变量加以说明扩展其作用域在整个程序中都有效所以会一直占用内存单元static说明符可以用于全局变量也可用于局部变量使变量在整个程序执行期间一直占用内存单元本题答案选A。 例210-09-34设函数中有整形变量n为保证其在未赋初值的情况下初值为0应该选择的存储类别是 C Aauto B)register C)static D)auto或register 【解析】对于静态局部变量(static)如在定义时不赋初值的话编译时自动赋初值0对数值型变量或空字符对字符变量。而对于自动变量auto或者缺省不写如果不赋初值则它的值是一个不正确的值。 10、内部函数与外部函数 l 用static 进行说明的函数称为静态函数也叫内部函数。静态函数只能被本编译单元体内的函数调用。一般形式static 类型标识符函数名形参表例如staticint fun(){…} 11、知识点库函数 l 函数可以分为库函数和用户自定义函数。库函数由C系统提供用户无须定义在调用C语言标准库函数时要包含include命令include命令行以#开头 例1、(07-04-17)若有代数式 (其中e仅代表自然对数的底数不是变量)则以下能够正确表示该代数式的C语言表达式是 C A)sqrt(abs(nxex)) B) sqrt(fbs(pow(n,x)pow(x,e))) C)sqrt(fabs(pow(n,x)exp(x,e))) D)sqrt(fabs(pow(x,n)exp(x))) 【解析】exp()函数的功能是返回以自然数e为底、函数参数x为幂的指数值ex ;pow(n,x)函数是计算nx fabs()函数的功能是返回函数参数的绝对值sqrt()用于返回函数参数的平方根。所以正确答案为C。 例2以下说法不正确的是B A)标准库函数按分类在不同的头文件中声明 B)用户可以重新定义标准库函数 C)系统不允许用户重新定义标准库函数 D)用户若需要调用标准库函数调用前必须使用预编译命令将该函数所在文件包括到用户源文件中 【解析】对每一类库函数都有相应的头文件名调用某个库函数时用户在源程序中须用include命令包含其头文件名。每一类标准库函数是C语言本身提供的用户不能重新定义标准库函数。 12、知识点数组与函数 l 数组用作函数参数有两种形式把数组元素下标变量作为实参使用和把数组名作为函数的形参和实参使用。 l 数组元素作函数的实参与普通变量并无区别所进行的传递是值形参变量和实参变量占据由编译系统分配的两个不同的内存单元 l 数组名作为函数参数时所进行的传递是地址相当于把实参数组的首地址赋予形参数组名或指针名形参数组与实参数组为同一数组共同拥有一段内存单元 例12011-09-31以下程序的主函数中调用了在其前面定义的fun函数 #includestdio.h main() {double a[15],k; kfun(a); }则以下选项中错误的fun函数首部是 ( D) A.double fun(double a[15]) B.double fun(double *a) C.double fun(double a[]) D.double fun(double a) 【解析】当一维数组名a作为实参时对应形参有三种表示形式*a、a[ ]、a[N]( 注N为定义a数组时的元素个数) 例111-03-11己知a所指的数组中有N个元素。函数fun的功能是将下标k(k0)开始的后续元素全部向前移动一个位置。请填空。 Void fun(int a[N],int k) { inti; for(ik;iN;i) a[【11】] a[i]; } 答案i-1 【解析】a[i]的值赋给a[i-1] 例210-09-32有以下程序 #include stdio.h #define N 8 void fun(int *x,int i) { *x*(xi); } main() { inta[N]{1,2,3,4,5,6,7,8},i; fun(a,2); for(i0;iN/2;i) { printf(“%d”,a[i]);} printf(“\n”); }程序运行后的输出结果是 C A) 1 3 1 3 B)2 2 3 4 C) 3 2 3 4 D) 1 2 3 4 【解析】数组名代表数组首地址即a[0]的地址。函数调用fun(a,2) 参数传递后形参指针x获得数组首地址即指向a[0]形参变量i2;*x即为a[0]*(x2)即a[2]*x*(x2)相当于a[0]a[2]a[0]变为3a[2]不变。返回到主程序循环4次输出a数组前4个元素: 3 2 3 4 例310-09-25有以下程序 #include stdio.h void fun(char *s) { while (*s) {if (*s%20) printf(“%c”,*s); s;} } main() { char a[]{“good”}; fun(a);printf(“\n”); }注意字母a的ASCII码值为97程序运行后的输出结果是 A A) d B)go C)god D)good 【解析】调用fun(a)函数实参字符数组名a传递给形参字符指针s使s指向字符串“good”在函数fun中对字符串进行遍历如果指针s指向字符ASCII码值是偶数则输出该字符。在字符串“good”中只有“d”的ASCII码值为偶数 13指针与函数 l 函数指针变量是指向函数的指针变量。 定义的一般形式为: 类型说明符*指针变量名(); 例如: int (*pf)(); 调用函数的一般形式*指针变量名实参表 例如z(*p)(x,y); Ä注: *指针变量名中的“()”不能少 例109-09-33设有以下函数 void fun(int n,char *s){…} 则下面对函数指针的定义和赋值均正确的是 A A)void (*pf)(); pffun; B)void *pf(); pffun; C)void *pf(); *pffun; D)void (*pf)(int,char);pffun; 【解析】本题考点为指向函数的指针的用法。函数名代表函数的入口地址可以赋值给指向函数的指针。指向函数的指针应该定义为void *pf().如定义为void *pf()则表示函数pf返回值为一个基类型为 void的指针。 l 函数指针变量不能进行算术运算。 l 指针型函数是指返回指针值的函数。定义的一般形式为 类型说明符 *函数名形参表{…} 例如int *ap(int x,int y){} 例1(10-09-11)有以下程序 #include stdio.h int*f(int *p,int *q) main() { int m1,n2,*rm; rf(r,n) ; printf(”%d\n”,*r) ; } int *f(int *p,int *q) { return(*p*q) ?p :q ;} 程序运行后的输出结果是______2_____ 【解析】本题中f是个指针型函数返回值为指针值。如示意图。 主程序中指针r指向m函数调用f(r,n)时实参传递给形参形参指针p指向m指针q指向n*p的值为m的值1*q的值为n的值2所以函数返回值为q返回给主程序中的指针r即指针r指向了n最后输出*r的值为n的值2. 例2(11-03-29)有以下程序 void fun(char *c) { while(*c) { if(*c’a’*c’z’)*c*c-(‘a’-‘A’); c; } } main() { chars[81]; gets(s); fun(s); puts(s) }当执行程序时从键盘上输入Hello Beijing回车则程序的输出结果是( C ) A)hello beijing B)Hello Beijing C)HELLO BEIJING D)hELLO Beijing 【解析】gets(s)将输入的Hello Beijing赋给了字符数组s调用fun(s)将字符数组s的首地址传给了cc指向的即为字符数组的首地址通过指针变量c取得字符数组中的字符判断是不是小写字母如果是变成大写字母。*c*c-(‘a’-‘A’)完成小写换大写的功能。故选C。另外注意gets(s)和scanf(“%s”,s);的区别scanf以空格作为字符串输入结束的标志而gets(s)不需要 第六课 结构体、链表与共用体 本课重要知识点 1.知识点用typedef定义类型 l 功能为已有数据类型取别名 l 类型定义形式 typedef 旧类型名 新类型名例如typedef double D 注意 1 定义的新名只是原名的一个别名并不是建立一个新的数据类型 2 用新名和原名定义的对象具有相同的性质和效果。 例12010-09-39若有以下语句 typedef struct S int g; charh;T; 以下叙述中正确的是 B A可用S定义结构体变量 B可用T定义结构体变量 CS是struct类型的变量 DT是struct S类型的变量 【解析】此题中用typedef 说明的新类型名T与中间部分的结构体类型具有相同的性质和效果 3. 知识点结构体变量的定义 具体形式 实例 说明 形 式 1 struct 结构体名 { 类型标识符 成员名 类型标识符 成员名 ……………. } struct 结构体名 变量名表列 struct student { char num[20] char name[20] char sex float score[4] } struct student stu1stu2 特点先定义类型后定义变量 注意定义变量时必须以struct student 开头缺一不可 形 式 2 struct 结构体名 { 类型标识符 成员名 类型标识符 成员名 ……………. }变量名表列 struct student { char num[20] char name[20] char sex float score[4] } stu1stu2 特点定义类型的同时定义变量 注意之后再定义同类型变量时也必须必须以struct student 开头 形式3 struct { 类型标识符 成员名 类型标识符 成员名 ……………. }变量名表列 struct { char num[20] char name[20] char sex float score[4] } stu1stu2 特点定义类型的同时定义变量 注意此形式省略了结构体名预示着后续程序中将不再定义该类型变量 形式4 typedef struct 结构体名 { 类型标识符 成员名 类型标识符 成员名 ……………. } STU STU 变量名表列 typedef struct student { char num[20] char name[20] char sex float score[4] } STU STU stu1stu2 特点先定义类型后定义变量 注意用STU或struct student定义变量具有同等效果用STU形式简洁方便 例1(:2009-09-36)下面结构体的定义语句中错误的是 B A)struct ord {int x;int y;int z;}; struct ord a; B)struct ord {int x;int y;int z;} struct ord a; C)struct ord {int x;int y;int z;} n; D)struct {int x;int y;int z;} a; 【解析】遵循先定义类型再定义该类型变量的原则类型定义末尾的分号“”必不可少 2.知识点 结构体变量各成员的引用 l 引用结构体变量的成员的方法是结构体变量名成员名 例如stu1.sex l 结构体指针变量引用成员的方法是 形式1*指针变量名成员名 例如*p.num 形式2 指针变量名-成员名 例如p-num l 运算符级别注意和-和 . 同级别均大于* 设有 structstudent {char num char name[20] struct date {int year,mon,day} birth float score[4] } struct student *pstu1 pstu1 成员类型 成员 操作方式 说明 普通变量 例如引用成员变量num 直接赋值stu1.num201101; 间接赋值p-num201101 输入scanf(“%d”, stu1.num); 输出printf(“%d”,stu1.num); 数组 例如引用成员数组元素score[0] 赋值stu1.score[0]75; 间接赋值p- score[0]75; 输入scanf(“%f”, stu1. score[0]); 输出printf(“%f”,stu1. score[0]); 字符串 例如字符数组成员作为字符串name 赋值strcpy(stu1.name,”zhangsan”); 间接赋值strcpy(p-.name,”zhangsan”); 输入scanf(“%s”, stu1.name); 输出printf(“%s”,stu1.name); %s作为格式控制时scanf和printf的输入和输出项均为地址 结构体嵌套 例如引用内嵌结构体变量birth的成员year 赋值stu1.birth.year1989; 间接赋值p- birth.year1989; 输入scanf(“%d”, stu1. birth.year) 输出printf(“%d”,stu1. birth.year) 例12009-9-12)设有定义 struct person { int ID;char name[12];} p; 请将scanf(%d, );语句补充完整,使其能够为结构体变量p的成员ID正确读入数据。 【解析】此题答案是 p.ID 即在成员ID前缀 p. 表示其从属于变量p操作方式与普通变量和数组没什么不同只需要在引用时前面标明属于哪个结构体变量。 例2(2010-03-38)有以下定义和语句 struct workers { int num; char name[20]; char c; srruct {int day;int month;int year;} s; }; struct workers w,*pw; pww 能给w中year成员赋1980的语句是 ( D ) A*pw.year1980; Bw.year1980; Cpw-year1980; Dw.s.year1980; 【解析】引用w的内嵌结构体变量s的成员year应逐级递进。具体方法参考前面表格。 例3(2011-03-36)设有定义struct {char mark[12];intnum1;double num2;} t1,t2;若变量均已正确赋初值则以下语句中错误的是C A)t1t2; B)t2.num1t1.num1; C)t2.markt1.mark; D)t2.num2t1.num2; 【解析】结构体以及结构体成员的赋值需要类型一致所有选项都满足但是mark是结构体中的字符数组的数组名其数组的首地址是一个指针常量只能在初始化的时候赋值故C错误。 例4(2011-03-37)有以下程序 struct ord { int xy;}dt[2]{1,2,3,4}; main() { struct ord *pdt; printf(%d,,(p-x));printf(%d\n,(p-y)); }程序运行后的输出结果是(D) A)1,2 B)4,1 C)3,4 D)2,3 【解析】dt是一个结构体类型的数组其有两个结构体元素p是结构体类型指针其指向dt即指向结构体数组的首地址p-x和p-y分别是结构体数组第一个元素的x成员和y成员的值在前则是先自增1再参与运算所以输出的是112和213故选D。 例5(2011-03-38)有以下程序 struct S { int a,b;}data[2]{10,100,20,200}; main() { structS pdata[1]; printf(%d\n,(p.a)); }程序运行后的输出结果是D A)10 B)11 C)20 D)21 【解析】结构体变量p赋值为结构体数组第二个元素的值即p.a20,p.b200;所以输出(p.a)为21故选D。 3.知识点 结构体变量与函数调用 l 将一个结构体变量的值传递给另一个函数有3个方法 1用结构体变量的成员作参数。例如用stu[1].num作实参将值传递给形参。用法和用普通变量作实参是一样的属于“单向值传递”方式。应当注意实参与形参的类型应保持一致。 2用结构体变量作实参。 对应形参也是同类型结构体变量也属于“单向值传递”方式。 3用指向结构体变量或数组的指针作实参将结构体变量或数组元素的地址传给形参。属于“地址传递”方式应注意在被调用函数中是否对该地址的值有影响。 例1(2009-09-14)有以下程序运行后的输出结果是 16 typedef struct { int num;double s;} REC; void fun1(REC x) { x.num23;x.s88.5; } main() { REC a{16,90.0}; fun1(a); printf(%d\n,a.num); } 【解析】main函数中的fun1(a); 是将a的值单向传递给了形参x相当于赋值给了x因此x的值的变化不会影响到a 例2(2009-09-38)有以下程序 struct A { int a;char b[10];double c;}; struct A f(struct A t); main() { struct A a{1001,ZhangDa,1098.0}; af(a); printf(%d,%s,%6.1f\n,a.a,a.b,a.c); } struct A f(struct A t) { t.a1002;strcpy(t.b,ChangRong);t.c1202.0;return t;} 程序运行后的输出结果是 D A)1001,ZhangDa,1098.0 B)1002,ZhangDa,1202.0 C)1001,ChangRong,1098.0 D)1002,ChangRong,1202.0 【解析】注意在f函数中的t.a1002;strcpy(t.b,ChangRong);t.c1202.0; 这三条语句。 4.知识点链表 l 当一个结构体中有一个或多个成员的基类型就是本结构体类型时,通常把这种结构体称为可以“引用自身的结构体”也称为“链表结构” 例如 struct link { char ch; Struct link *p; }a; 在此p是一个可以指向struct link类型变量的指针成员因此a.pa是合法的表达式由此构成的存储结构如图所示。 l 对链表进行的操作通常有以下四种 1.建立带有头结点的单向链表 2.顺序访问单向链表各结点数据域的值即遍历链表 struct std { int data; /*数据域*/ struct std * next; /*指针域*/ }; …建立头结点和数个节点即建立以下链表 遍历链表 phead; while(p!0) { printf(%4d,p-data); pp-next; } } 3.删除单向链表中的某个结点 删除q指向的节点 p-nextq-next;或者p-nextr; free(p); 4.向单向链表中插入结点 将r指向的节点插入p、q所指的两个结点之间 r-nextq; 或者r-nextp-next; p-nextr; 例1(2011-09-37)在以下程序 #includestdio.h main() {struct node{int n;struct node *next;}*p; struct node x[3]{{2,x1},{4,x2},{6,NULL}}; px; printf(“%d,”,p-n); printf(“%d\n”,p-next-n); }程序运行后的输出结果是 B A.2,3 B.2,4 C.3,4 D.4,6 【解析】通过赋值语句px即px[0]使p指向了x[0]因此p-n等价于x[0].n输出2p-next等价于x[0].next即x1或表示为x[1]p-next-n也可表示为x[1].n输出4 例1(2009-03-15)以下程序把三个NODETYPE型的变量链接成一个简单的链表并在while循环中输出链表结点数据域中的数据请填空 #include stdio.h struct node {int data; struct node *next;}; typedef struct node NODETYPE; main( ) {NODETYPE a,b,c,*h,*p; a.data10;b.data20;c.data30;ha; b.nextb;b.nextc;c.next’\0’; ph; while(p){printf(“%d”,p-data) pp-next } } 【解析】while就是用来遍历链表的为了能遍历每个结点每执行一次循环就要使变量p指向下一个结点所以空白处应填pp-next 5.知识点共用体类型定义 l 共用体是一种构造数据类型遵循先定义类型再定义该类型变量的原则 l 用途使几个不同类型的变量共占一段内存(相互覆盖) l 与结构体结构体与共用体 1.区别: 存储方式不同 结构体变量占用的内存单元,是其所有成员占内存单元的总和,而共用体变量是其所有成员中占用空间最大的成员的内存单元 2.联系: 类型定义、变量定义、成员引用等操作方式相同两种类型可相互嵌套 例1.(06-04—41)有以下程序 main() {union {char ch [2]; int d; }s s.d0x4321; printf(“x,xn”s.ch[0]s.ch[1]) } 在16位编译系统上程序执行后的输出结果是___ A __ A)2143 B)4321 C)4300 D)2100 【解析】此题考查整形数据在内存中存放形式以及共用体内存分配。对于共用体而言字符数组ch与整型变量d共用2个字节的存储空问存储器存储数据原则是低地址存放低字节高地址存放高字节于是0x4321中2l存放在低字节中43存放在高字节中故输出时s.ch[0]输出21s.ch[1]输出43。 第七课 编译预处理、文件 本课重要知识点
1.知识点main()函数的参数
l 定义形式main(int argc,char *argv[]) {… }
l int argc是命令行中的字符串数char *argv[]是指向字符串的指针数组系统使用空格把各个字符串隔开。
2.知识点不带参数的宏定义
l 一般形式#define 宏名 字符串或数值
即用字符串或数值取代宏名。
l 宏名一般采用大写字母表示以与变量名区别也可用小写字母。
l 宏定义不是C语句不必在行末加分号。
例12009-04-36有以下程序
#includestdio.h
#define PT 3.5
#define S(x) PT*x*x
main()
{int alb2printf(4.1f\nS(ab))}
程序运行后输出的结果是D
A)14.0 B)31.5 C)7.5 D)程序有错无输出结果
【解析】此题考查宏的定义形式。由于宏定义并不是语句故#define后面不能有分号故该程序有错无法输出结果所以正确答案D。
例22011-03-30以下函数的功能是通过键盘输入数据为数组中的所有元素赋值。
#define N 10
void fun(int x[N])
{ inti0;
while(iN)scanf(“%d”,_________);
}在程序中下划线处应填入的是
A)xi B)x[i1] C)x(i) D)x[i]
答案C
【解析】要求给每个元素赋值while循环的变量i必须不断增加所以A、B显然不行i是先参与运算在自增1i是先自增1再参与运算所以D会出现x[0]未赋值的情况故选C。
l 对程序中用“”括起来的字符串内的字符即使与宏名相同也不进行置换。
l 宏定义可以嵌套使用例如
#define R 3.0
#define PI 3.14159
#define L L*PI*R
3.知识点带参数的宏定义
l 一般形式#define 宏名参数表 字符串
l 带参数的宏不占运行时间只占编译时间只是简单、机械字符替换宏名无类型。
l 要注意有括号和没括号的区别
例12009-09-35有以下程序
#include stdio.h
#define f(x) x*x*x
main()
{int a3,s,t;
sf(a1); tf((a1));
printf(“%d,%d\n”,s,t);
}程序运行后的输出结果是A
A)10,64 B)10,10 C)64,10 D)64,64
【解析】本题考点为带参数的宏定义宏定义中的参数没有类型仅为字符序列不能当作表达式运算。宏展开时把实参字符串原样写在替换文本中。sf(a1)a1*a1*a110tf((a1)) (a1)* (a1)* (a1)64
例2(2011-03-35)有以下程序
#define S(x) 4*(x)*x1
main()
{ intk5,j2;
printf(%d\n,S(kj));
}程序运行后的输出结果是(B)
A)197 B)143 C)33 D)28
【解析】#define宏定义只是机械简单的置换S(kj)S(52)4*(52)*521143
4.知识点文件包含
l 一般形式#include 文件名或者#include “文件名”
l 与” ”的区别即系统到存放C库函数头文件的目录中寻找要包含的文件” ”即系统先在用户当前目录中寻找若找不到再到存放C库函数头文件的目录中寻找。
l 文件包含可以嵌套。
l 凡是以“#”开头的行都是预处理命令行。
5.知识点calloc()函数
l 函数原型void *calloc(unsigned n,unsigned size);
l 功能分配n个数据项的内存连续空间每个数据项的大小为size
6.知识点free()函数
l 函数原型void free(void *p);
l 功能释放p所指的内存区
7.知识点malloc()函数
l 函数原型void *malloc(unsigned size);
l 功能分配size字节的存储区
例1(2011-03-14)以下程序运行后的输出结果是 emoclew 。
main()
{ char *p; int i;
p(char *)malloc(sizeof(char)*20);
strcpy(p,welcome);
for(i6;i0;i--) putchar(*(pi));
printf(\n); free(p);
}
【解析】(char*)malloc(sizeof(char)*20)申请一个20个字符大小的空间首地址赋给字符指针变量pstrcpy(p,welcome);将字符串welcome赋值给p所指向的空间for循环实现从后往前输出这个字符串free(p)为释放申请的空间。
8.知识点文件的概念和文件指针
l 在C程序中文件可以用顺序方式存取可以用随机方式存取。
l C程序把文件分为ASCII文件文本文件和二进制文件。
例12009-09-40下列关于C语言文件的叙述中正确的是C
A)文件由一系列数据依次排列组成只能构成二进制文件
B)文件由结构序列组成可以构成二进制文件或文本文件
C)文件由数据序列组成可以构成二进制文件或文本文件
D)文件由字符序列组成其类型只能是文本文件
【解析】本题考点为文件的基本概念。正确答案为C。C语言中根据数据的组织形式分为二进制文件和ASCII码文件。一个C文件时一个字节序列或者二进制序列而不是一个记录结构序列。
l 文件类型指针FILE *fpfp是一个指向FILE类型结构体的指针变量通过文件指针变量找到与它相关的文件。
例22010-09-15以下程序打开新文件f.txt并调用字符输出函数将a数组中的字符写入其中请填空。
#include stdio.h
main()
{ FILE *fp;
char a[5]{‘1’,’2’,’3’,’4’,’5’},i;
fpfopen(“f.txt”,”w”);
for(i0;i5;i)fputc(a[i],fp);
fclose(fp);
}
9.知识点fopen()函数和fclose()函数
(1)fopen函数
l 调用方式fpfopen(“file1”,”r”)
l 使用文件方式如”r”只读打开一个文本文”w”只写打开或建立一个文本文件”a”追加打开一个文本文件在文件末尾添加数据。
例1(2011-03-40)设fp已定义执行语句fpfopen(file,w);后以下针对文本文件file操作叙述的选项中正确的是(B)
A)写操作结束后可以从头开始读 B)只能写不能读
C)可以在原有内容后追加写 D)可以随意读和写
【解析】文件打开方式‘w’只能向该文件写入如打开的文件不存在则以指定的文件名建立文件如存在则先删除再重建一个文件。故选B。
l 若不能实现打开任务fopen函数将带回一个空指针值NULL。
例12009-04-13以下程序用来判断指定文件是否能正常打开请填空。
#include stdio.h
main()
{FILE *fp;
if(((fpfopen(“test.txt”,”r”)) NULL ))
printf(“未能打开文件\n);
else
printf(“文件打开成功\n”);
}
【解析】考查文件打开操作。打开文件使用fopen函数正常打开时返回指向该文件的文件指针否则返回值为NULL题目中当if条件表达式成立时输出“未能打开文件!”故fopen函数返回值为NULL。正确答案NULL。
(2)fclose()函数
l 调用方式fclose(fp);
l 顺利完成关闭操作返回值为0否则返回EOF-1。
10.知识点fputc()函数和fgetc()函数
l fgetc()函数的调用形式chfgetc(fp);从打开的文件fp中读取一个字符。
l fputc()函数的调用形式fputc(ch,fp);将字符输出到fp所指向的文件中去。
11.知识点fread()函数和fwrite()函数
l fread()函数的调用形式fread(buffer,size,count,fp);其中buffer是一个指针size是每个数据块的字节数count是每次读入数据块的个数fp是文件指针。
例1structstud {char name[10]; int num; }stu[40];
假设学生的数据已存放在磁盘文件中如何读入40个学生的数据
for(i0;i40;i)
fread( stu[i] , sizeof(struct stur) ,1,fp);
l fwrite()函数的调用形式fread(buffer,size,count,fp);其中buffer是输出数据的首地址。
12.知识点fscanf()函数和fprintf()函数
l fscanf(文件指针格式控制字符串输入列表)
l fprintf(文件指针格式控制字符串输出列表)
例12011-09-40有以下程序
#includestdio.h
main()
{FILE *fp;
int k,n,i,a[6]{1,2,3,4,5,6};
fpfopen(“d2.dat”,”w”);
for(i0;i6;i)fprintf(fp,”%d\n”,a[i]);
fclose(fp);
fpfopen(“d2.dat”,”r”);
for(i0;i3;i) fscanf(fp,”%d%d”,k,n);
fclose(fp);
printf(“%d,%d\n”,k,n);
}程序运行后的输出结果是 (C)
A.1,2 B.3,4 C.5,6 D.123,456
【解析】第一次fpfopen(“d2.dat”,”w”);以写方式打开通过循环将a数组全部写入文件中并且每行写一个第二次fpfopen(“d2.dat”,”r”); 以写方式打开然后通过循环每次读取两个数字给k和n第三次k和n分别得到5和6
例12009-04-40有以下程序
#include stdio.h
main()
{FILE *f;
ffopen(“filea.txt”,”w”);
fprintf(f,”abc”);
fclose(f);
}若文本文件filea.txt中原有内容为hello则运行以上程序后文件filea.txt的内容为C
A)helloabc B)abclo C)abc D)abchello
【解析】程序中定义了一个文件指针然后用fopen()函数以写的方式打开文件“filea.txt”并让指针f指向它执着调用fprintf()函数将“abc”写到指针所指向的文件中。由于filea.txt里原来的内容”hello”被”abc”覆盖掉所以文件“filea.txt”里最后的内容为”abc”本题答案选C。
13.知识点fgets()函数和fputs()函数
l fgets(str,n,fp);从fp指向的文件输入n-1个字符在最后加一个’\0’得到字符串共有n个字符把它们放到字符数组str中。
l fputs(“China”,fp);把字符串”China”输出到fp指向的文件字符串末尾’\0’不输出。
2010-03-40有以下程序
#include stdio.h
main()
{FILE *fp;char str[10];
fpfopen(“myfile.dat”,”w”);
fputs(“abc”,fp);fclose(fp);
fpfopen(“myfile,data”,”a”);
fprintf(fp,”%d”,28);
rewind(fp);
fscanf(fp,”%s”,str);puts(str);
fclose(fp);
}程序运行后的输出结果是C
A)abc B)28c C)abc28 D)因类型不一致而出错
【解析】以“a”方式打开一个已存在的文件原有文件内容不被删除位置指针移到文件末尾可作添加和读操作。fputs(“abc”,fp);把字符串”abc”输出到fp指向的文件。
14.知识点rewind()函数
l 调用形式rewind(fp);
l 功能使位置指针重新返回文件的开头。
15.知识点fseek()函数
l 功能改变文件的位置指针
l 调用形式fseek(fp,100L,0);将位置指针移到离文件头100个字节处。
l 文件首 SEEK_SET 0 文件当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2
16.知识点ftell()函数
l ftell(fp);
l 功能得到流式文件中的当前位置。
17.知识点feof()函数
l feof(fp);
l 判断文件是否结束结束返回值为1否则为0。
例1(2011-03-15)以下程序运行后的输出结果是 【15】 。
main()
{ FILE *fp; int x[6]{1,2,3,4,5,6},i;
fpfopen(test.dat,wb);
fwrite(x,sizeof(int),3,fp);
rewind(fp);
fread(x,sizeof(int),3,fp); for(i0;i6;i)printf(%d,x[i]); printf(\n); fclose(fp);
}
答案123456
【解析】fwrite(x,sizeof(int),3,fp);将数组内的前三个元素即123输出到文件中去rewind(fp);文件回到开头fread(x,sizeof(int),3,fp);将文件的内容读出并存到x数组的前三个元素中把123写到数组的前三个元素中去所有数组中的元素值均没变。