目 录
第一章 C语言基础知识 参考答案 ..................................................... 错误!未定义书签。 第二章 顺序结构 参考答案 ............................................................... 错误!未定义书签。 第三章 选择结构 参考答案 ................................................................... 错误!未定义书签。 第四章 循环结构 参考答案 ................................................................... 错误!未定义书签。 第五章 函数 参考答案 ....................................................................... 错误!未定义书签。 第六章 指针 参考答案 ........................................................................... 错误!未定义书签。 第七章 一维数组 参考答案 ................................................................... 错误!未定义书签。 第八章 二维数组 参考答案 ................................................................. 错误!未定义书签。 第九章 字符串 参考答案 ................................................................. 错误!未定义书签。 第十章 对C语言的深入讨论 参考答案 .............................................. 错误!未定义书签。 第十一章 结构体与共用体 参考答案 ................................................... 错误!未定义书签。 第十二章 文件 参考答案 ............................................................... 错误!未定义书签。
第一章 C语言基础知识 参考答案
一,选择题
1
C
2 D
3 A
4 C 5 A
6 D
7 C 分析:C答案以数字开头了 8 D 分析:int 是关键字 9 C
10 D
11 B
12 D 分析:Visual C++中int类型的变量占的字节数为4; 13 B 分析:B中出现了8,而八进制只能有0到7组成 14 D 分析:答案D中开头是0不是o 15 A
16 D
17 B
18 D 分析:2++5%2=++1=本题目考察算术运算符,需要注意整数除 以整数结果只能是整数 19 A
20 C
21 A
22 C
23 D
24 C分析:考察的是强制类型转换,正确的是k%intf 25
B
26 C
27 C
28 B
29 A分析:本题目主要考察n++表达式的值是n变化之前的值,然后使n的值增加1 30 A
31 D分析:inta+b/b=int+=5+=b=同样a,b的类型是 double型的
32 D分析:long 和short不能相互修饰 33 A
34 C
35 B
36 B分析:C语言的标识符中只能包含字线、数字和下划线,没有连接符;
37 D分析:不同的计算机系统或者编译系统,对3种整数类型所占用的字节数有不同的 规定; 38 B
39 A分析:++运算符有前缀和后缀两种形式,本题中的选项C就是前缀形式,其表达 式的值为增1后的值,而选项A为后缀形式,其表达式的值为增1之前的值;而选项B和D 的表达式都是k加1之后的值
40 D分析:字符常量是用单引号括起来的单个字符,所以选项B错误;此外还有一种特殊的字符专为控制设计,称为转义字符,有三种转义字符:一种是由一个“\\”开头加一
个普通字符组成,代表一个字符;如’\\’’表示一个单引号字符,所以选项D正确;’\\\\’表示一个斜杠字符,而选项C中的’\\’则是错误的;用“\\”与其后的1~3位八进制数字构成的字符序列,表示ASCII码等值于该八进制数的字符;用“\\x”与其后的1~2位十六进制数字构成的字符序列,表示ASCII码等值于该十六进制数的字符;所以选项A错误; 41 B分析:字符常量是用单引号括起来的单个字符,所以选项A正确;此外还有一种特殊的字符专为控制设计,称为转义字符,有三种转义字符:一种是由一个“\\”开头加一个普通字符组成,代表一个字符;如’\\n’表示一个换行符,所以选项D正确;用“\\”与其后的1~3位八进制数字构成的字符序列,表示ASCII码等值于该八进制数的字符,所以选项B错误,因为9不是八进制数字;用“\\x”与其后的1~2位十六进制数字构成的字符序列,表示ASCII码等值于该十六进制数的字符;所以选项C正确; 42 D
43 B
44 A
45 B分析:选项A中字符’0’的ASCII码值为48,所以A的结果不为1;选项B中’\\0’代表空值,空值NULL的ASCII码值为0所以结果为1;选项C中字符’1’的ASCII码值为49,所以结果不为1;选项D相当于用0-48结果也不为1; 46 D
如果要表示十六进制字符,则要用’\\x’开头,所以选项A错误;如果要表示八进制,则’\\0’开头,后面跟1~3位的八进制数,八进制数由0~7组成,不包含8,所以选项B错误;用单引号括起来的单个字符才是字符常量,所以C错误;而’\\n’是转义字符,用来表示回车符; 47 C
先将c1 变量中的字符的ASCII码值输出,即为65,将变量c2中字符的ASCII
码值减2后输出,即为66; 48
A变量c1和c2中的值相同,所以转换成二进制数后,对应的二进制位上的值也相同,
当两值相同时,只有进行异或运算,结果才为0,所以c1^c2值为0;所以本题的正确答案为A;
二,填空题
1 位 0 1
2 关键字 预定义标识符 用户标识符 3 8
4 八 十 十六
5 int float double 6 5+2=5+=
7 15 16 a++表达式的值是a变化之前的值,当然a本身增加了1 8 把10赋给变量B
9 printf“a=%d,b=%d”,a,b; 10 3
整个表达式是一个逗号表达式,变量n和i赋值为2后,通过++i将i的值增加1变为3, 然后再通过i++为i增加1,整个逗号表达式的值为i++的值,此时是后缀,所以整个i++
表达式的值为3,而变量i的值为2; 11、1 12、3
第二章 顺序结构 参考答案
一 选择题
解析:结构化程序的算法可以解决任何复杂的问题;
解析:C程序的基本组成单位是函数,在C程序中每行可以写多条语句,每条语句以分号结
束,每条语句可以占用几行,在几行内写完; 解析:随意使用空语句会导致逻辑上出现错误,不要随便使用;
解析:在printf语句中,格式控制的个数只有一个,即%d,而输出项有两项,即a和b;而得
到的结果应该只有一个,所以应该输出第一个变量的值,即变量a的值; 解析:m=0256,即m是八进制的数0256,要以八进制无符号的形式输出,即输出256;n=256,
即n是十进制的数256,也要以八进制无符号的形式输出,首先要把十进制数转化为八进制数,256转化为八进制为0400,以无符号形式输出,即输出400; 解析:第一个数据的输出控制宽度是2位,但是x的值是102,占3位,要输出的数据宽度大
于规定的输出宽度,由于数据时右对齐方式,所以按数据的实际宽度输出,输出102;第二个数据要求以十进制形式输出,输出控制宽度是2,y的值为012,是八进制数,所以要转换成十进制数10后再输出;
解析:float x=;说明x为单精度浮点数据,单精度浮点数据对应的输出格式应该为%f;
.解析:-m++遵循从右向左结合的原则;m++的值为m自增之前的值,所以执行完x=-
m++以后,x被赋值为-3;表达式x=x+8/++n中有加号除号,先算8/++n,++n的值为自增之后的值为5,8/5取整为1,即x=x+8/++n转化为x=x+1,即把x+1的值赋给x,x的值变为-2; 解析:输入控制中第一个数要求以“%2d”形式输入,即要求输入一个两位的数,而从键盘
输入的数为876,所以从左到右取两位数字87,即把87赋值给整型变量a,余下的6再赋值给浮点型变量b,自动进行类型转换,b的值为,后面输入的543则没有赋值给变量;
解析:从键盘输入数据的格式必须与输入控制要求的格式一样,B答案三个之间不要有空
格;C答案用逗号分开是多余的;D答案格式不匹配;
解析:x乘以100是为了把x小数点后的两位小数变为整数,再加上,如果小数点后一位大于等于5则会进一位,如果小数点后一位小于5则不会出现进位的情况,再对其进行强制类型
转换,采用舍去法丢掉小数部分,即对x乘上100后的数实现了小数位到整数位的四舍五入;最后再除以,把数字变回原来的大小,整数与浮点数相除结果为浮点数,即实现了要求;
解析:第1个输出语句要求ch以%c字符形式输出所以为输出“a”,以%d整数形式输出为,
字符转换为整型要使用ASCII码所以为“97”,k没有对应的输出符所以没有输出,第2个输出语句要求以整型方式输出k得到“12”;结果为“a,97,k=12”;
二.填空题
1.结构化
2.一条语句 分号
21 37 =10,j=20 回车 65 第三章 选择结构 参考答案 一、选择题 1、D 逻辑运算符两侧运算对象可以是任意合法的表达式,应该是两条语句,所以选D; 2、A 此题主要是考查C语言中if语句的合法条件表达式描述,在C语言中“不等于”用“=” 描述而不是用“<>”描述;B、C、D选项都是合法的表达式; 3、D if语句的表达式可以是任意合法的表达式 4、D 此题主要是考逻辑运算和关系运算的优先级别.只要掌握、算术运算和&&的优先级别便 可选对.这几种运算符的具体优先级关系见见教材P188,附录三; 5、A 此题主要是考逻辑运算符、&&和||之间的优先级别;最高,&&次之,||最低;先求得a为 0,所以不必计算b的值,即a&&b的值为0,由c=0,c=1,而0||1=1,所以选A; 6、答案是B C语言的字符以其ASCII码的形式存在,所以要确定某个字符是大写字母,只要确定它的 ASCII码在’A’和’Z’之间就可以了,选项A和C符合要求;大写字母的ASCII码值的范围为65到90,所以D选项符合要求,所以只有C是错误的; 7、D 此题考到了++运算符以及逻辑运算;当计算机碰到a&&b时,先计算表达式a的值,若为 真才会计算表达式b的值,否则将不会去计算b的值,因为一旦a=0,则0&&b必为0;而a||b则正好是相反的,即先计算表达式a的值,若a为假才会计算表达式b的值,否则将不会去计算b的值,因为一旦a=1,则1||b的值必为1,理解了这两点后,我们在看题目:i++==1的值为1,此时i为2,所以计算&&后的表达式,首先计算++j==3的值为1,j的值为3,由上面的原理我们可知,||后面的表达式不用再计算,所以此时i,j,k的值分别为2,3,3; 8、C 此题主要是从概念上考if和else的配对问题 9、A 此题主要是从实际应用上考if和else的配对问题,a=1,则a的值是假,程序执行第一 个if下的第一个else语句,在判断a==0显然条件为假查看第二个if是否有其配对的else,发现没有,则执行最后一条printf语句输出b的值,因为在整个过程中程序没有对b的值做任何改变,所以答案选择A. 10、D 此题主要是考if和else的一般形式;if后面的语句要么是单条语句,要么是由{ }扩 起来的复合语句,不能是if后有两条语句的,所以本题程序在运行的时候会出错; 11、C 此题考到了关系运算和逻辑运算及一定数学知识;|x-y|<10可等价为-10 14、C 此题主要是考查逻辑值用整数值替代的结果,数0代表逻辑假,非零值代表逻辑真; 15、C 此题主要是考查if-else-if和if语句;具体分析见教材第49页例7; 16、C此题主要是考查if-else-if以及关系表达式的运算;首先判断第一个条件a>b>c的值 为0,所以不执行第一条语句;在判断第二个条件,c-1>=c表达式的结果为假,所以也不执行其下面的语句,因此执行最后一条语句,将输出d+2的值为4 ; 17、C 此题主要是考查条件表达式和条件运算符;首先要注意条件表达式的结合方向,它是从 右至左的可参照附录三 第一个条件表达式的值为a,第二个条件表达式的值为c ,而c=6,所以答案选C ; 18、A此题主要是考查if-else语句和条件表达式的转化;只要理解了if-else语句和条件 表达式的运算规则的话,就很容易选出A; 19、D 此题主要是考查在switch语句中break和default的作用及break的适用范围;详细 说明可参看教材第三章 P53对switch的说明部分; 20、 B 此题考查的是条件表达式求解问题;先看第一个条件表达式语句,ak=b=2;再看第二个条件表达式语句,k>c为假,所以k=k=2选 B 21、C 此题考查逻辑与 && 的运算工作特性,&&运算的是从左至右,当左边表达式的值为假时, 右边的表达式则不执行,因本题中 k1=k1>k2的值为0亦为假,该表达式是一个赋值语句,且此时k1的值为0,因而右边的表达式k2=k2>k1不执行,因此K2的值没有做任何改变;值依然是20,所以本题选选B; 22、C 此题考查的是真假条件的等价问题;x-y为真表示x-y是非0的,也即x-y<0或x-y>0 即 选C; 23 答案是B 满足表达式c>=2&&c<=6的整型变量c的值是2,3,4,5,6;当变量c的值不为2,4,6 时,其值只能为3或5,所以表达式c=3和c=5中至少有一个为真,即不论c为何值,B 选项中的表达式的值都为真,所以B选项正确; 24 答案是D 举个例子 如x=3带入得出结果为0的选项是D选项; 25 答案是D 条件x==0||x==1为真,所以执行y=1,然后执行 y=xx-x-2x-2=1--1-1=1-1=0,所以选择A; 26 答案是B 此题考查if语句条件表达式后的语句块区分问题;题中第一条if语句之后有两条赋值语句,但他们不在一个复合语句之内,所以只有a=b是直接附属于第一条if语句的,因此当a=3,b=5,c=7,则a>b为0,程序不执行a=b,但执行c=a 此时c的值是3,在第二条if语句的条件表达式中c=a条件值为0,则不执行c=b因此最终a、b、c的值为3、5、3,因此选B 27 答案是D C语言的字符以其ASCII码的形式存在,所以要确定某个字符是大写字母,只要确定它的 ASCII码在’A’和’Z’之间就可以了,选项B的书写格式错误,而选项C不符合要求;大写字母的ASCII码值的范围为65到90,所以A选项不符合要求,小写字母的ASCII码比大写字母的ASCII码大32,所以只有D是正确的; 28 答案是B,此题考查三目运算符的运算特性; 29 答案是B,此题考查switch语句运算过程; 30 答案是C,表达式y%3==0的值为1,所以执行下面的输出语句,表达式—y的值为8,所以输 出结果是8;选择C; 31 答案是C,表达式x%3的值为2,非0所以执行下面的输出语句,将x--的值8输出,此时x 的值变为7,然后再执行下一个输出语句,将--x的值6输出,x的值也变为6,所以选择C; 32 答案是D,这是嵌套形式的switch语句,因为break结构影响较大,而此程序中的第一个 case后没有break语句,程序执行时,x=1,执行内嵌的switch语句,因y=0,执行a++,使变量a的值为1并终止内层switch结构,回到外层;程序继续执行case 2后面的语句a++;b++;,这使变量a,b的值分别为2和1,外层switch语句结束;所以此题选择D; 33 答案是C,switch语句中开关条件必须是整型、字符型和float类型,此外强制类型转 换的格式C选项正确; 二、填空题 1、答案是:x%3==0&&x%7==0 2、答案是: 4 分析:程序中是一个if—else结构;分析时要理清if与else的配对情况; 3、答案是:4,5,99 分析:题中的重点在于两个if结构,大家要注意两点:第一,如果if后面没有花括号,则它后面的第一条语句是它的结构体,并且只有一条语句;如果后面是一个结构,则整个结构都属于if结构的结构体;第二,变量在不断的被重新赋值,所以其值在不断的变化; 4、答案是:yes,分析:该题与第二题是同一回事; 5、答案是:1; 分析:这个题还上一个if—else结构,考查点仍然是考察考生是否能够正确识别if后面括号里的表达式p=a=0,根据运算符的优先级知道,这里应该先算a=0,这是一个逻辑运算,a的值为5,所以a=0为真,其逻辑值为1,将1赋值给p,所以条件为真,输出p的值,为1; 6、答案是:非零 7、答案是:585858; 分析:题中有三个if结构,注意,这三个if结构是相互独立的,是互不相关的,只要他们的条件成立,就要执行其结构体后面的输出语句;通过键盘输入,得a的值为58,所以a>50为真,输出58;然后判断a>40,仍然为真,再输出58,最后判断a>30,肯定为真,所以再输出58,连续三次输出58; 8、答案是:0; 分析:本题的关键在于关系运算符的运算次序,a=5,b=4,c=>b>c看起来是真的,但是这这 是数学里面是这样的,这里我们要一步一步的计算,先算a>b,a确实大于b,所以为真,逻辑值为1,后面的计算就变成了1>c,显然为假,逻辑值为0,并将它赋值给d,所以最后输出d的值为0; 9、答案是:3; 分析:这个题主要考察条件运算符;程序要输出P/3>0 p/10:p%3这个条件表达式的值;P为30,所以p/3=10,10>0显然为真,所以整个表达式的值应该是p/10的值,p/10得3; 10、答案是:2 1; 分析:题中是一个switch嵌套结构;里面的switch是case 1的语句,题的关键点在于这个语句即里面的这个switch结构的后面并没有跳出整个结构的break语句;所以,当x=1,与case相配以后,执行完后面的语句即里面的这个switch结构,然后没有遇到break语句,所以并不跳出结构体,而是继续执行case 2后面的语句;所以最后得到的结果应该是2 1,而不是1 0; 11、答案是:0; 字符空格的ASCII码不为0,所以本题中表达式c的值为0,b=0&&1的结果显然为0; 12、答案是:2; 此题考查逻辑或运算的运算特性,当||运算的左边的表达式值为1时则不进行右边表达式的计算;此外对于自增运算a++的运算规则是先使用在自增; 13、答案是:-4; 表达式n的值为1,所以执行x-=1后x=1;表达式m的值为非0值,所以执行其后的语句x-=2后x的值为-1,表达式x的值也为非0,所以执行其后的语句后x的值为-4,最后输出x的值即为-4; 14、答案是:&; 表达式c==5的值为真,所以表达式的值等于1,因此输出符号“”,然后执行“break”,继而去执行“default:printf“&”;”语句,输出符号“&”; 15、答案是:12 17; 当从键盘输入x的值为12时,程序自上而下执行经过三个if条件判断第一个条件不满足,第二、第三两个都满足;因此最终输出结果为12 17; 16、答案是:a:b c:t1; 条件表达式类似于if语句,根据“”前面子表达式的逻辑值来判断应该计算“:”前面的子表达式还是后面的作为整个条件表达式的结果;题目要求输出a、b、c3个变量中的最小值,所以当a第四章 循环结构 参考答案 一、选择题: 1. B 解析:a的值为1,a<6为真,执行循环体,b的值加a后为3,a的值加2后为3,b的值与10求余运算后值为3; ① a的值为3,a<6为真,执行循环体,b的值加a后为6,a的值加2后为5,b的值与10 求余运算后值为6; ② a的值为6,a<6为真,执行循环体,b的值加a后为11,a的值加2后为7,b的值与10 求余运算后值为1; ③ a的值为7,a<6为假,不执行循环体,直接输出a、b的值为7,1; 2. A 解析:k的值为5,进入循环,--k表达式的值为4真,同时k的值改变为4,输出表达式k-=3的值1,同时k的值为1;k为1,表达式—k的值为0, 结束循环; 3. A 解析:X=0,y=5,z=3,z>0&&x<4值为真,进入循环体,y值为4,z值为2, x值为1 1. z>0&&x<4值为真,进入循环体, y值为3,z值为1, x值为2 2. z>0&&x<4值为真,进入循环体, y值为2,z值为0, x值为3 3. z>0&&x<4值为假,结束循环; 4. 输出x,y,z的值3,2,0 4. D 解析:当K的值为3时,只执行case 3后面的语句n+=k,n的值为3; 当k的值为2时,先执行case 2后面的语句,但没有break,所以不会退出,继续执行case 3后面的语句n+=k,n的值为5; 当k的值为1时,先执行case 1后面的语句n+=k,n的值为6,先执行case 2后面的语句没有,继续执行case 3后面的语句n+=k,n的值为7;输出n的值7; 5. B 解析: 在循环体中有“s+=1;”s的初始值为0,要让s的值等于2必须是循环体执行两遍;当循环提执行两遍后a的值等于-3,所以在n=-3的时候循环体执行两遍后条件表达试a=0为假,会退出循环; 6. B 解析: 程序开始时,y=10,while循环中执行y自减运算,值的注意的是他的循环体只是一个空语句,则由于自减运算y-- 的特点:先使用后自减,因为当y的值减为0时,while循环结束,但y变量依然执行自减运算,此时y = -1;因此最终输出的y的值为 y=-1,因此选B; 7. A 解析:x=3; 先执行循环体,输出表达式x-=2的值1,同时x的值也改变成1,再判断表达式的值x,x的值为1真,x为假,循环结束; 8. B 解析:分析:B选项每次进入循环体,都要先执行p=1;即1赋值给p.所以不能求出5的 值; 9. D 解析:变量i每次增量为2,变化过程为:1->3->5->7->9,语句s+=1每次执行使s增加的数为:2,4,6,8,10,所以s的值为自然数1~10中偶数的值; 10. C 解析:C项s=s+1/n, 1/n首先运算,n为整型变量,1也是整型变量,当n=2…10时,1/n的值为整数0,故C不正确 11. B 分析过程与第6题类似; 12. C 13. A 从键盘输入 1 2 3 4 5 0后,程序从main函数开始执行,先将1读入到s变量中,while的判断条件s>0成立,则执行循环体;循环体语句是一个switch结构的语句,依据s的值去执行相应的case语句,直到碰到break语句跳出switch结构;第一次s为1,执行case 1: 此时输出6,没有碰到break语句,继续执行case 2:输出5,紧接着碰到break语句跳出本次switch结构;然后程序再次读入整数2再次执行while循环……;此题需要理解switch语句的执行过程; 14. D 解析:在循环中当x等于0,3,6,9时x%3等于0,这时会进入if语句执行printf语句,在输出前x会先自加;屏幕上输出14710; 15. D 解析: 注意a变量在for循环的表达式3和循环体中都有改变; 16. 2345 解析:选择中没有此答案;本题注意的是在循环第一次进入switch语句的时候 是执行的default后面的语句块,由于没有break,所以还会执行case2:case4:后面的语句; 17. A 解析: 首先执行++n,判断条件表达式n<=0为假退出循环;B条件表达式1永远为真是无限循环,C条件表达式n的值为10永远为真是无限循环,D没有条件表达式,所以没有退出条件,是无限循环;此题要注意的是0为假,非0为真; 18. B 解析:此题考查for语句的嵌套以及if语句的执行;此题输出的结果是m=1; 分析:第一次循环 i=1,j=3 19. D 解析:第一次循环x=8,x%3<>0,进入if语句输出x的值为8,然后x自减1,执行continue立即进行下次循环条件判断;第二次循环x=6,x%3=0,不进入if语句,执行if语句后面的printf“%d,”,--x,x先自减1再输出得到5;第三次循环x=4,x%3<>0,进入if语句输出x的值为4,然后x自减1,执行continue立即进行下次循环条件判断;第四次循环x=2,x%3<>0,进入if语句,输出x的值为2,然后x自减1,执行continue立即进行下次循环条件判断;第五次循环x=0,判断表达式x>0为假;结束循环输出结果为8,5,4,2;答案D 20. C 解析:第一次循环a=0,a%2=0,进入if语句的else部分输出字符A,第二次循环a=1,a%2=1,进入if语句输出字符2, 第三次循环a=2,a%2=0,进入if语句的else部分输出字符C, 第四次循环a=3,a%2=1,进入if语句输出字符4, 第五次循环a=4,a%2=0,进入if语句的else部分输出字符E, 第六次循环a=5,a%2=1,进入if语句输出字符6,此时a=6,跳出循环,因此最终结果输出:A2C4E6; 21. A 22. B 解析:外层循环3次,i的值在内层循环中依次为1,2,3内层循环次数依次为3,2,1次; 23. D 解析:代码“ifn%3=0 continue;”无实际意义;当n自加到4的时候结束循环;答案D; 24. D 解析: 表达式2为赋值语句k=1,条件永远为真,会进入死循环;答案D 25. A 解析:0%任何数等于0,所以第一次循环的时候就进入了if语句退出了for循环;i=21,i<20为假,退出了while循环;a的值为21; 26. D 解析:i的初值为0,第一次循环的时候满足i<0,进入第一个if语句,执行continue直接进行下次循环,i的值没有改变;第二次循环又重复了第一次循环的操作,所以是死循环; 27. B解析: 控制每行输出“”号的过程;一共四行,每行输出奇数个; 二.填空题: 1. 7 解析:从键盘输入14 63后程序将14赋给变量m,63赋值给变量n,最外层的while条件m=n为真,进入循环体;循环体语句是两组while循环,依次计算改变m、n的值直到m=n时程序结束,因此最终输出m的值为7; 2. 11 解析:循环的判断表达式为i<5,i的初值是1,所以i得值依次是1,2,3,4; sum=sum+1+2+3+4,sum的值等于11.答案是11 3. n=n/10 解析:此题的解法是先用输入的数据%10可以得到个位数,再让输入的数据除以10,使十位变成个位;循环使用上面的方法;当只剩下个位的时候也就是n小于10的时候n/10等于0退出循环;所以填入的是“n=n/10”; 4. 3 4 解析:此题考查for循环语句的执行机制;表达式3在跳出循环前会执行一遍,因此i的值最后为3; 5. 5 解析:for循环语句的循环体是空语句; 6. 6 解析:此题属于循环的嵌套;当i=1时,输出0个号,当i=2时,输出1个号,当i=3时,输出2个号,当i=,4时,输出3个号,共输出6个号; 7. 0 解析:getchar只能获得单个字符,输入“1234567890”ch的值为‘1’;循环条件为假,循环一次也没有执行;答案为:0 8. 23 解析:参考第3题;答案:54321 9. k<=n k++ 解析: 见书59,64页while和for循环的执行过程;答案:k<=n k++ 10. ACE 解析:理解字符转化为整形数使用到ASCII码,‘a’的ASCII码是97,‘f’是102,‘A’是65;答案是ACE 11. k<=n 12. 23 解析:此题需理解的是在switch中case后面没有break的话会继续执行下一个case或default后面的语句;答案为23 13. 1 3 2 解析:m=0,n=0,k=0,i=9 ①当i值为9时,i<=11为真,执行switch语句,i/10的值为0,匹配case 0,执行m++,n++,再执行break语句,跳出switch体,再执行i++, i值为10;此时m值为1,n的值为1,k的值为0. ②当i值为10时,i<=11为真,执行switch语句,i/10的值为1,匹配default,执行k++,n++,结束switch体,执行i++,i值为11. 此时m值为1,n的值为2,k的值为1. ③当i值为11时,i<=11为真,执行switch语句,i/10的值为1,匹配default,执行k++,n++,结束 switch体,执行i++,i值为12. 此时m值为1,n的值为3,k的值为2. ④ i值为12时,i<=11为假,结束for循环;最后输出m,n,k的值132. 14. i<10 i%3 解析:根据题意先得到100以内所有个位是6的数,在判断哪些能被3整除;答案为i<10 i%3=0; 15. 074 解析:当a的值为0时,a<20为真,则执行b=a%10后b的值为0,执行putchar函数后输出字符0,for循环中表达式3中每次a递增7,所以第二次循环时,a的值为7,a<20为真,则执行b=a%10后b的值为7,执行putchar函数后输出字符7;第三次a的值为14,,a<20为真,则执行b=a%10后b的值为4,执行putchar函数后输出字符4,此时执行表达式3后a的值为21,a<20条件为假,循环结束;因此最终答案为输出:074 第五章 函数 参考答案 一 选择题 解析:在C程序的书写时,严格的缩进要求可以增强程序的可读性,但是不会影响程序的编 译于运行; 解析:在C程序中必须有且仅有一个主函数为main函数,它是程序的入口和出口;但是没 有规定它在程序中具体的位置; 解析:函数的实参可以使被调用函数的调用语句;但是总之函数的实参个数之间用逗号隔开, 个数,类型分别于形参的一一对应; 解析:当程序在函数体中执行时,遇到return语句结束函数的调用;即使函数体中有多个 return语句,但是遇见第一个return语句时函数的调用就结束了,后面的return语句是不会再执行的也就是说即使有多条return语句,最终执行的只有一句;而返回值是void类型的函数一般有return语句是缺省的,如果要有不能return语句后面不能有返回值,可以是return;;如果函数体中没有使用return语句,当函数调用结束后,还是会回到调用处的; 解析:其他解析同上;return语句中可以有表达式和常量,变量等; .解析:调用语句可以出现在表达式,实参和当一句话独立存在,但是不能出现在形参中,形参 一般情况下是变量; 解析:考察的是函数的调用;其中的实参有两个,实参1为逗号表达式最终的值,实参2为 自增表达式的值; 解析:f1x,y的作用是返回x、y中较大的,f2x,y的作用是返回x、y中较小 的;d=f1a,b=f14,3=4 d=f1d,c=f14,5=5 e=f2a,b=f24,3=3 e=f2e,c=f23,5=3 此时各值为a=4,b=3,c=5,d=5,e=3,f=a+b+c-d-e=4;所以答案d, f , e为5, 4, 3 解析:函数不能嵌套调用,但是可以自己调用自己成为递归;被调用函数在调用之前可以先 声明,再调用,后定义;构成C程序的基本单位是函数而不是语句; 解析:fun1a=a2,fun2x,y=intfun1x+fun1y=int x2+ y2,所以fun1,=int+=int=5 由于w是double型的,所以w的值为; 解析:函数的值是单向传递的,只能是从实参传到形参,而且只有当从实参传到形参时才 为形参分配一定的存储空间;等函数调用结束后,这个空间就会被释放掉; 解析:考察函数的调用;调用语句中的实参有两个,实参1为表达式2a,其值为8,实参2 为调用语句funb,c,在这个调用语句中又有两个实参分别传给fun函数的形参a和b,调用结束后返回的值为5;故实参2的最终值为5,再次调用函数fun,分别把8传给a,把5传给b,最后返回的结果值为6.故答案选B. 解析:函数不能嵌套定义;改变形参的值不会影响实参的值;函数体中要使用C中的库函 数,得包含定义其所在的头文件; 考察的是函数的声明;在函数声明时,声明是一句话,其中形参的类型不能省略,但是形参 名可以省略;声明时形参名可以和定义时的形参名不相同,但是类型必须匹配;声明时必须指出函数的返回值类型和名称,这两点必须与定义时的返回值类型和名称一一对应; 17. B 解析:允许这种函数说明的方式存在;如果只在主函数中说明,则只能在主函数中调 用f;如果在主函数以前说明,则包括主函数的所有函数都可以调用,如果同时主函数又说明了,则不影响; 18. B 19. C 20. A 解析:程序的执行总是从main函数开始,在main函数结束,无论main函数在程序的 什么地方; 21. D 22. A 解析:函数fint v,int w的功能是将实参v和w进行交换,但是实参值的变化对形 参没有影响,所以本题中x,y,z中的值不发生变化; 23. C 解析:本题考察的是函数的递归调用;在解决这类题时,先找出何时被调用函数调用 结束,然后确定被调用函数总共被调用了几次;再分析最终的结果; 24. B 上面已经分析过同类问题; 25. A 考察的还是递归调用的问题; 26. B.同时; 27. A.解析:在主函数中确定循环的次数为三次,实参i的值分别为0,.故调用f函数的次 数为3次;故结果为1+101+401=503. 28. B.解析:主函数中第一次调用fun函数时实参为3,故调用fun函数时在函数体中循环 了3次,输出了3个;第二次调用fun函数时实参为4,故输出了4个;由此可以确定选择B答案; 29. B 30. D 主函数的循环语句中对fun函数总共调用了4次,每次都返回形参a的值;只有在把 值从实参传给形参时才为形参分配存储空间,等函数调用结束,这个空间会消失掉;所以形参a的值在每次调用时都为2,故最后主函数中的s的值为2222=16. 二.填空题 1. 1.0,, 解析:分别求出变量的初始值;a=ax为的是求xn ,所以其初始值为1,b=bi 位的是求n,所以其初始值为1,当n=0时,s=1,所以s的初始值为1;由 于定义的是double型的数据,所以答案为a=,b=,s=; =funa,4+funb,4-funa+b,4; 解析:由程序可以看出funx,n=xn;funa,4=a4, funb,4=b4,funa+b,3=a+b3,当要计算m= a4+ b4+a+b3 时,函数调用语句 为m= funa,4+ funb,4+ funa+b,3; 3. x,xx+1 解析:1求fx的累加和,即为求f0+f1+ f2+ f3+ f4+……,函数SunFun来实现此功能;括号中应该填入累加的序号值,即为x; 2fx=x2+1,Fint x函数来实现这个功能,所以填写xx+1; 4. 5.0 解析:fun1a=a2,fun2x,y=intfun1x+fun1y=int x2+ y2,所以fun1,=int+=int=5 由于w是double型的,所以w的值为; 5. 1 3 解析:fun函数是一个递归函数,主函数中调用的fun3共递归两次,fun3中又调用 fun3/2即fun1,先输出fun1中x的值,为1,然后再输出fun3中x的值为3;所以结果为1 3; 6. double max 解析:通过程序可以看出,main函数中使用了max函数,而其他地方没有对max函数进行说明;所以程序中应该对max函数进行说明;说明的格式为double maxdouble,double; ,2,2,3 解析:同课本本章第三节例1; 8. 2 5 解析:同上面第5题相类似; 9. 55 10. 30 0 第六章 指针 参考答案 一、选择题 1 答案:A 分析:本题主要考指针赋值,n2=n1;是把n2的值赋给n1,故根据指针赋值的定义可知选A, 即把q所指对象的值赋给p所指对象; 2 答案:B 分析:本题主要考指针定义,因为p指向变量x,故输出其值的时候应该是x的值; 3 答案:C 分析:本题主要考指针的定义和赋值,C前面是定义一个量a并赋值为10,后面定义一个指针, 并把a的值赋给这个指针; 4 答案:D 5 答案:A 分析:本题主要考的是指针的变量的赋值,在使用scanf函数的时候,后面跟的是一个地址, 由于pa本身保存的是地址,故选A 6 答案:D 分析:本题主要考的指针的赋值及指向指针的指针的赋值,根据定义知选D;B的正确形式是 q=2;C的正确形式应该是q=&p; 7 答案:C 分析:本题主要考的是全局变量和局部变量,以及指针的用法,第一个f&a的返回值是5,第 二个返回值是2; 8 答案:A 分析:本题主要考的是变量自加,指针传值,以及指针的赋值;通过第二行a=b可知p1,p2指 向的变量的值相同,都指向了b所指的对象,也是p2所指的对象’a’,由于a++;是实现a所指对象的自加,故由’a’变成’b’,故最终选A; 9 答案:A 分析:本题主考NULL,一般来说当我们把一个空值以整数的形式输出出来的时候,默认的情 况是0; 10 答案:C 11 答案:C 分析:本题主要考指针的指针,c先指向b,b是一个指针,它指向a,故c最终是指向a的,故 其值是a中的值; 12 答案:A 分析:本题主要考指针的赋值,我们不能把一个具体的值赋给一个指针变量;B选项是w,p指 向同一对象;C是p指向a;D是把w所指对象的值赋给p所指对象; 13 答案:B 分析:本题主要考指针传值,p,q分别指向a,b,然而r会指向它们的较小值; 14 答案:D 分析:在D中把一个整形变量的值赋给一个指针的地址,故而是错的;应该写成p=&a; 15 答案:D 16 答案:D 17 答案:C 分析:本题主要考指针标识符和乘号的区别,p=p1p2中第1,2,4个号是指针标识符,而第三 个是乘号,故其运算的结果是3; 18 答案:A 19 答案:A 分析:本题主要说的是函数的递归调用,函数fun实现的功能是从1加到n,然后返回给主函 数; 20 答案:D 分析:A不能把一个具体的值赋给一个指针变量;B q是指向指针的指针只能保存指针的地 址;C同B; 21 答案:D 分析:A指针赋处初值时不能把一个具体的值赋给一个指针变量指向的地址;B语法错误,C 不能发地址赋给浮点型变量; 22 答案:C 分析:scanf函数的输入数据列表应该是合法的地址表达式; 23 答案:D 分析:A中b需要预先定义,B中字符变量b只能接收单个字符;C中二级指针应定义为c; 24 答案D 25 答案:B 二、填空题 1 答案:8 4 分析:void f函数里的x,y分别是一个指针变量和整型变量,指针x指向一个整型的变量, 即指向主函数里的x,故在函数void f里修改指针x的值,会影响到主函数里的x的值,但修改void f里的y的值却不会影响到主函数里的y的值;因为主函数x传的是地址,y传的是值; 2 答案:d; 3 答案:35 分析:p,q分别指向x,y,然后调用函数swap;它的功能是把两个指针所指向的对象交换,原 来a,b分别指向x,y,但交换后分别指向y,x,所以并不把指向的对象的值交换; 函数返回后,p,q仍然分别指向x,y;故其值不变; 4 答案: n=n/10 分析:把n除以10,每执行一次就可以把数的阳未位去掉,因为两个整数相除,不会保留小数, 故最低位会丢掉,并且把数缩小到十分之一;然后依次从个位到最高位把数字输出; 5 答案:654321 第七章 一维数组 参考答案 一.选择题 1. 答案:B 分析:A答案,初始化值的个数超过了常量表达式的值;C答案,左边定义的是普通字符变量;D答案,整型数组不能赋字符串; 2. 答案:D 考点:一维数组的定义 分析:一维数组定义的形式为:类型名 数组名常量表达式 注意点:1常量表达式不能省略,不能为变量,但可以使宏定义名 2数组名是用户定义标识符; A答案中没有0…2008这种形式的常量表达式;B中省略了常量表达式,因此是错误的;C答案常量表达式不能为变量; 3. 答案:D 分析:常量表达式不能为变量; 4. 答案:B 考点:循环和数组元素的引用 分析:int p8={11,12,13,14,15,16,17,18} (1) i=0,j=0,判断:i++<7为真,i的值为1,判断if中的表达式p1%2为假,不执行j+=p1 (2) i=1,j=0,判断:i++<7为真,i的值为2,判断if中的表达式p2%2为真,执行j+=p0后j的值 为13 (3) i=2,j=13,判断:i++<7为真,i的值为3,判断if中的表达式p3%2为假,不执行j+=p1 (4) i=3,j=13,判断:i++<7为真,i的值为4,判断if中的表达式p4%2为真,执行j+=p0后j的值 为28 (5) i=4,j=28,判断:i++<7为真,i的值为5,判断if中的表达式p5%2为假,不执行j+=p1 (6) i=5,j=28,判断:i++<7为真,i的值为6,判断if中的表达式p6%2为真,执行j+=p0后j的值 为45 (7) i=6,j=45,判断:i++<7为真,i的值为7,判断if中的表达式p1%2为假,不执行j+=p1 (8) i=7,j=45,判断:i++<7为假,结束循环 (9) 输出j的值为45 5. 答案:C 分析: 第一次循环,i=0,i%2=0,a0%2= 0,a0=a0+1=3; 第二次循环,i=1,1%2=1,a1=0; 第三次循环,i=2,a2%2=1,a2=a2-1=4; 第四次循环, i=3,i%2=1,a3=0; 6. 答案:D 分析:ABC三个答案都是给所定数组范围外的元素赋值 7. 答案:A 分析:本题考察点是,用scanf函数赋值时,空格,回车等间隔符都是输入终止符 8. 答案:B 分析:在定义指针变量s时将数组名a赋给s,则s指向数组a的第一个元素,s+3就指向 数组a中的第三个元素 9. 答案:A 分析:同第8题 10. 答案:B 分析: 本题是统计数组s中所放的字符串中有多少个数字字符;‘\\0’代表着字符串的结束,所以,只有’0’,’1’,’2’三个 11.答案:C 分析:数组x的类型是double,所以输入格式控制符应该用“%lf”,scanf后面跟,地址,所以选c 12. 答案: D 分析:循环、数组元素的引用和逻辑运算 int p7={11,13,14,15,16,17,18} (1) i=0,k=0,判断:i<7&&p0%2为真,执行k=k+p0后k的值为11,执行i++后i的值为1; (2) i=1,k=11,判断:i<7&&p1%2为真,执行k=k+p1后k的值为24,执行i++后i的值为2; (3) i=2,k=24,判断:i<7&&p2%2为假,结束循环;注意:2<7&&p2%2左边为真,但是右边为假,那么整个表达式为假; (4) 输出k的值为24; 13. 答案:A 分析:循环嵌套,交换 int x={1,3,5,7,2,4,6,0} 第一个嵌套循环 (1) i=0,i<3为真 1) j=2,j>=0为真,判断x3>x2为真,进行交换后x={1,3,7,5,2,4,6,0},j-- 2) j=1,j>=0为真,判断x2>x1为真,进行交换后x={1,7,3,5,2,4,6,0},j— 3) j=0,j>=0为真,判断x1>x0为真,进行交换后x={7,1,3,5,2,4,6,0},j— 4) j=-1,j>=0为假,i++ 2 i=1,i<3为真 1j=2,j>=1为真,判断x3>x2为真,进行交换后x={7,1,5,3,2,4,6,0},j-- 2j=1,j>=1为真,判断x2>x1为真,进行交换后x={7,5,1,3,2,4,6,0},j— 3j=0,j>=1为假,i++ 3 i=2,i<3为真 1j=2,j>=2为真,判断x3>x2为真,进行交换后x={7,5,3,1,2,4,6,0},j-- 2j=1,j>=2为假,i++ 4i=3,i<3为假 第二个嵌套循环: 1i=0,i<3为真 1j=4,j<7为真,判断x5 分析:地址是常量,不能进行自增运算; 15. 答案:C 分析:每次循环,数组b的元素依次作为数组a的下标 16. 答案:A 分析:用strlen求字符串长度时,只算实际字符的个数 17. 答案:C 分析:本题调用fun函数时,参数传递,第一个是址传递,传递的是数组名也就是数组a中第一个元素的地址,第二个是值传递 18. 答案:B 分析:同17题,本题还有函数的递归调用,即:函数自己调用自己 19. 答案:D 分析:p是数组的第一个元素,则p++是给数组第一个元素的值加一 20. 答案:C 分析:第一个for循环中,数组s的元素作为数组c的下标依次相加 21. 答案:D 分析:a+i是数组a中第i个元素的地址,再加号就是第i个元素的值了,不用再加号 22. 答案:A 分析:p指向数组a中第一个元素,则p+2就是第三个元素 23.答案:B 分析:p指向的是数组a的第三个元素,q指向的数组a的第五个元素 24. 答案:C 分析:p0值为数组a的第二个元素4,p1值为6,p2值为8 25. 答案:A 分析:p指向数组a的第一个元素,通过p依次将数组a中元素数出来 26. 答案:D 分析:p为指针变量,不能赋普通数值,只能赋地址 27. 答案:D 分析:把a3地址赋给p,所以p0就是a3,p5就是a8; 28. 答案:B 分析:s0是数组第四个元素,所以,s2是数组第六个元素0 29.答案:C 分析:s是数组名也是数组第一个元素的地址,所以,s是数组第一个元素的值r,r+2就是t 30.答案:B 分析:sizeof是求x在内存中占多少字节,strlen是算字符串的实际长度 31.答案:C 分析:通过循环将数组t中奇数位上的值依次相加 32.答案:C 分析:指针数组的定义 33.答案:D 分析:通过调用函数fun,将实参a传递给形参s,则s就指向数组a中第一个元素,fun函数中循环的功能是输出数组a中ASCII值为偶数的字母 34.答案:A 分析:考点:数组名和指针变量 该题中定义了一个一维数组,其中的元素为20个,定义了指针变量p,将数组名赋值给变量p,即:该指针变量指向了数组的首地址,数组的第一个元素; A、p得到的值为数组中的第一个元素的值,和s0等价; B、s中的元素个数为20 ,p所指的字符串为“Beijing”为6个 C、s为数组名;是首地址,为地址常量,不是变量; D、s数组中的内容为{‘B’,‘e’,‘i’,‘j’,‘i’,‘n’,‘g’,‘\\0’,‘\\0’ ,‘\\0’ ,‘\\0’ ,‘\\0’ ,‘\\0’ ,‘\\0’ ,‘\\0’ ,‘\\0’ ,‘\\0’ ,‘\\0’ ,‘\\0’ ,‘\\0’},而p所指的内容为:“Beijing”,故不相同; 故选答案A; 35. 答案:A 分析:考点:字符串 字符串的存储:用数组存储,在最后的末尾有一个‘\\0’. 定义了一个指针变量pc.将数组名赋值给变量pc,即pc指向了数组的首地址,pc+5的到的是第下标为5的字符的地址,即:‘z’的地址,pc+5得到的为字符‘z’的值;所以最后的值为z. 36. 答案:D 分析:通过赋值,让指针p指向数组a的最后一个元素,再给p减一,指向数组a的第三个元素,然后将其值赋给y,所以,选D 37. 答案:D 分析:在main函数中,指针变量r指向数组a的第一个元素,通过函数调用,f函数中的指针变量p也指向数组a的第一个元素,所以,p+3就是数组第四个元素,但数值传递的话,形参的改变是不影响实参的,所以选D 38. 答案:D 分析:函数fun的功能是输出数组P的第5个元素,在主函数中,把a3的地址赋给函数fun,因为在C语言中,数组的下标是从0开始,所以数组中输出的第8个元素,即9; 39.答案:D 分析:考点:函数间数据的传递 函数的调用:如果传递的是普通变量,则在传递过程时为:单向传递;如果传递的是数组名、变量的地址和指针时,值为双向传递; 40.答案:C 分析:将fun函数调用三次,大家要注意:参数传递时,有地址传递也有数值传递 41.答案:A 分析:调用函数fun时,参数一为地址传递,参数二为数值传递 42.答案A: 分析:调用fun函数时,实参为指针数组名,所以,形参必须为二级指针 43.答案:C 分析:fun函数中第一个while循环是将字符串中a前面的全部去掉,第二个while循 环是将a指向的字符串赋给b 44.答案:B 分析:函数的递归调用 45.答案:B 分析:调用prt函数时,实参有地址传递也有数值传递 46.答案:A 分析:指针q赋空值,没有指向,所以不能赋普通值 二、填空题 1. 答案:24 分析:考点:数组和循环;I,j的初值为0 ; 判断while括号中表达式的值,如果为真值,执行后面的循环语句;<7&&pi%2==1 表达式可以表示为0<7&&11%2==1为真值,表达式的值为真值;执行 j+=pi++;变量i变为1,i++表达式的值为0的值为11,j=j+11=11; 的值为1,pi的值为13,所以表达式i<7&&pi%2==1的值为真值,执行语句j+=pi++;变量i变为2,i++表达式的值为1的值为13,j=j+13=24; 3.i的值为2,pi的值为14,所以表达式i<7&&pi%2==1的值为假值;退出循环;最后变量j的值为24. 最后输出变量j的值为:24 2. 答案:1111 分析:考点:for循环和数组; 这是一个for循环;其中红色框内的内容为根在for语句后面的一条语句,当for语句中的表达式2的值为真值时,则执行后面的语句; 1. 执行表达式1,变量i变为1,执行表达式2,表达式2:i<=4为真值,执行语句,将ni-12的值 赋值给ni;ni-1的值为n0即0;所以ni-12的值为0,即ni得到的值也为0,执行完该语句后执行输出语句,输出的是ni+1的值,即1.执行表达式3:变量i变为2; 2. 执行for语句表达式2,表达式2:i<=4为真值,执行语句,将ni-12的值赋值给ni;ni-1的值 为n1即0;所以ni-12的值为0,即ni得到的值也为0,执行完该语句后执行输出语句,输出的是ni+1的值,即1. 执行表达式3:变量i变为3; 3. 执行for语句表达式2,表达式2:i<=4为真值,执行语句,将ni-12的值赋值给ni;ni-1的值 为n2即0;所以ni-12的值为0,即ni得到的值也为0,执行完该语句后执行输出语句,输出的是ni+1的值,即1. 执行表达式3:变量i变为4; 4. 执行for语句表达式2,表达式2:i<=4为真值,执行语句,将ni-12的值赋值给ni;ni-1的值 为n3即0;所以ni-12的值为0,即ni得到的值也为0,执行完该语句后执行输出语句,输出的是ni+1的值,即1. 执行表达式3:变量i变为5; 5. 执行for语句表达式2,表达式2:i<=4为假值,不执行语句,退出循环语句;所以最后得到 的值为1111 3. 答案:i-1 分析:将ai的元素移动到前一个位置,那么就是ai-1=ai 4. 答案;‘\\0'或者填写 0 分析:字符串的结束标志‘\\0’ 5. 答案:9 6. 答案:10 7. 答案:3 8. 答案:14 9. 答案:13 10. 答案:6 分析:考点:指针、数组、多目运算符 指针:指针是有指向,当对指针进行号运算时,得到的值为该指针所指向的变量的值; 多目运算符:表达式1 表达式2:表达式3 当表达式1的值为真值时,执行表达式2的值;当表达式的值为假值时,执行表达式3的值; 分析:该题中的p为指针变量,得到的数组中第一个元素的地址,即:指针变量指向了数组中的第一个元素,即a0; 11.答案:19 分析:考点:指针、数组 指针:指针是有指向,当对指针进行号运算时,得到的值为该指针所指向的变量的值; 分析:该题中的p为指针变量,得到的数组中第二个元素的地址,即:指针变量指向了数组中的第二个元素,即a1; 1、 执行表达式1,变量x的值为0,执行表达式2的值:x<3为真值,执行循环的语句:y+=p+x, p 指向了数组中的第二个元素;p+x即得到的是第二个元素的地址,p+y得到的值为数组中第二个元素的值,即:4;所以语句y+=p+x;为y=y+4=1+4=5; 执行完后返回到for循环的表示的3:x++,变量x的值为1. 2、 执行表达式2的值:x<3为真值,执行循环的语句:y+=p+x, p指向了数组中的第二个元 素;p+x即得到的是第三个元素的地址,p+y得到的值为数组中第三个元素的值,即:6;所以语句y+=p+x;为y=y+6=5+6=11; 执行完后返回到for循环的表示的3:x++,变量x的值为2. 3、 执行表达式2的值:x<3为真值,执行循环的语句:y+=p+x, p指向了数组中的第二个元 素;p+x即得到的是第四个元素的地址,p+y得到的值为数组中第四个元素的值,即:8;所以语句y+=p+x;为y=11+8=19; 执行完后返回到for循环的表示的3:x++,变量x的值为3 4、 执行表达式2的值:x<3为假值,退出整个循环;最后输出变量y的值;即:19 12.答案:6 分析:定义了一个指针变量p,并将数组名a赋值给变量p,所以变量p指向了数组的第一个元素; 13.答案:5756 分析:略考试不考;省略,学员不用做 14.答案:2 4 分析:定义了指针变量p和指向指针的指针变量k.将数组名赋值给变量p,则p指向了数组的第一个元素,k=&p.即:将指针变量p的地址赋值给变量k,,即:k指向了指针变量p. 15. 答案:135 16. 答案:P 17. 答案:211 18. 答案:21 第八章 二维数组 参考答案 一、选择题 1 答案:C 2 答案:B 分析:定义二维数组时,若不指定第一维,必须给该数组赋值,D 赋值的是三行 3 答案:D 分析:未指明第二维长度 4 答案:D 分析:AN是变量,B前者是一行两列,后面是两行一列,C必须指明第二维长度 5 答案:C 分析:未指明第二维长度 6 答案:D 分析:ABC越界 7 答案:B 分析:存放顺序a00,a01…..a05,a10,a11….a15… 8 答案:C 分析:int m3={1,4,7,2,5,8,3,6,9}; 由{}可判定m数组是三行三列的数组, 输出的是m数 组的第三行的值 9答案:A 分析:ifi<2 a1i=a1i-1; 由此可判定a10=3,a11=4, else a1i=1;a12=1 a01=2 10 答案: B 分析:将2,6,9,2,相加 11答案:B 分析:t20=3,t11=5,t02=7 12 答案: B 分析:将a00分别和a00,a11,a22,a33比较,若a00小则交换,再将a11和a22,a33比较,若a11小则交换 13 答案:A 分析:将每列排序,依次输出a00,a11,a22,a33 14 答案: C 15 答案:B 分析:p0 指向a10的地址,p0+1指向的是a11的地址 16 答案: A 17 答案: D 分析:相当于给a33赋值0-9,输出a10a11,a12 18 答案: A 分析: 是二维数组的指针定义方式;假设该数组为a,p指向该数组的a00,p表示取该行的值;p+i表示指针移动了i个位置,即此时p指向ai0,p+i表示取第i行的值,p+ij,则指定了取出第i行第j个数值 19 答案:B 20 答案:B 分析:见18 21 答案:D 22 答案:C 23 答案:C 24 答案:C 分析:同15题 25 答案:B 26 答案:A 分析:pa1i等同a1i,见第9题 27答案:B 分析:forj=i;j<=i;j++ t=t+bibjj;B 解析 在内存中,字符数据以ASCII码存储,它的存储形式 与整数的存储形式类似;C语言中,字符型数据和整型数据之间可以通用,也可以对字符型数据进行算术运算,此时相当于对它们的ASCII码进行算术运算,在本题中,s++相当于s=s+1,即让s指向数组中的下一个元素; 6. C 解析 该题稍微难一点;主要要搞清楚以下几点: ①定义了一个指针数组char p2后,程序中第一个循环fori=0;i<2;i++pi=chi;的作用,是使 指针数组的p0元素它本身是一个指针指向了二维数组ch的第一行字符串,并使指针数组的p1元素指向二维数组ch的第二行字符串,这样,就使指针数组p和二维数组ch建立起了一种对应关系,以后对二维数组ch的某个元素的引用就有两种等价的形式:chij或pij; ②对二维数组ch的初始化,使其第一行ch0中存入了字符串\"6937\第二行ch1中的内容为 字符串\"8254\"; ③程序中第二个循环中的循环体s=s10+pij-'0';的功能是这样的,每执行一次,将s中的值 乘以10也即,将s中的数值整体向左移动一位,并在空出来的个位上添一个0,再将当前pij中的字符量转换为相应的数字,然后把这个数字加到s的个位上; ④注意到内层循环的循环条件pij>'\\0 '是指pij中的字符只要不是字符串结束标志'\\0' 就继续循环,语句j+=2;是使下标j每次增加2,也即一个隔一个地从pi所指向的字符串中取出字符;经过上述解析后,不难看出,该程序首先从p0所指向的字符串\"6937\"中一个隔一个地取出字符,分别是'6'和'3',然后从p1所指向的字符串\"8254\"中一个隔一个地取出字符,分别是'8'和'5',同时经过转换和相加运算后,结果s中的值应该是6385; 7. D 8. A 解析 在给p和q数组赋初值时,系统会自动添加字符串结束符,从题目中可以看出 数组p和q都有3个字符,所以长度均为3; 9. A 解析 函数funchar s,int n的功能是对字符串数组的元素按照字符串的长度从小 到大排序;在主函数中执行funss,5语句后,ss={\"xy\\"aaaacc\的输出结果为xy,aaaacc; 10. B 解析 考查指向字符串的指针变量;在该题中,指针变量p指向的应该是该字符串中 的首地址,p+3指向的是字符串结束标志'\\0'的地址,因而p+3的值为0; 11. .B 17. D 23. A 29. C 35. A 1. a 解析 'z'的ASCII码值为122,经过c-25运算后,得97,以字符形式输出是a; 2. BCD CD D 解析 本题考查指向字符串的指针的运算方法;指针变量p首先指向字符串中的第一个字符 A,执行p=s+1后,p指向字符串中的第二个字符B,然后输出值\"BCD\"并换行,依次执行循环语句; 3. AFK 4. 213 5. 09 6. 4 7. fabcde 8. si+1 9. are you How 10. 1AbCeDf2Df 11. p+n 12. s-1 13. t 11. p+n 12. s-1 13. t 12. D 18. C 24. C 30. A 36. A 13. D 19. A 25. C 31. A 37. A 14. D 20. A 26. A 32. C 38. C 15. A 21. D 27. C 33. B 39. A 16. D 22. A 28. B 34. D 40. D 二 填空题 第十章 对C语言的深入讨论 参考答案 一 选择题 1. A 6. C 11. D 解析 C语言中的预处理命令以符号开头,这些命令是在程序编译之前进行处理的,选项D的 描述错误; 12. A 17. B 22. C 13. D 18. A 23. C 14. A 19. B 24. C 15. B 20. A 25. A 16. B 21. C 26. C 2. D 7. B 3. A 8. B 4. D 9. C 5. D 10. A 27. C 28. D 二 填空题 29. C 30. D 1. 3sizeofdouble 2. p=doublemallocsizeofdouble; 3. 16 11 4. feoff1 5. findbig 6. /i 7. 3sizeofdouble 8. p=doublemallocsizeofdouble 9. 16 11 10. 40 11. 55 12. 6 第十一章 结构体与共用体 参考答案 一、选择题答案 1. C 二、填空题答案 1. 1001,ChangRong, 2. p=p->next 3. personi.sex 4. p=p->next 5. struct DATE d={2006,10,1} 6. ->next->data 第十二章 文件 参考答案 一、选择题 二、填空题 1. 123456 2. NULL 3. fp,”r” 4. Hell 5.””,”r” 6. feoffp 因篇幅问题不能全部显示,请点此查看更多更全内容