C语言培训班老师发的资料包9月C语言题集三答案_第1页
C语言培训班老师发的资料包9月C语言题集三答案_第2页
C语言培训班老师发的资料包9月C语言题集三答案_第3页
C语言培训班老师发的资料包9月C语言题集三答案_第4页
C语言培训班老师发的资料包9月C语言题集三答案_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、第章 函数选择题1. 解析: 本题综合考查函数的调用方式。函数的形参和实参具有以下特点:形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送

2、给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。本题中A)和C)选项是最常识的问题,希望考生能通过以上分析掌握相关知识点。2. 解析: 本题考查函数的综合知识。首先,我们可以利用强制转换类型转换运算符将一个表达式转换成所需类型。如:(double)a是将a转换成double类型;(int)(x+y)是将x+y的值转换成整型。本题可按部就班地逐步运算:fun(int)fun(a+c,b),a-c)fun(int)fun(10,5),2-8)fun(int)15.000000,-6)fun(15,-6)93. 解析: C语言的程序是由主函数main()开始运行,由主函数来调

3、用其他函数,所以,选项A)错误。C语言中定义的函数必须是并列的,不能在一个函数中定义其他函数,选项B)错。函数必须先定义后使用,在调用函数以前要定义函数,而main()函数不必放在最前面,故选项D)错。4. 解析: 如果实参是简单变量,它与对应形参之间的数据传递方式是由参传给形参,而形参值的改变不能改变实参的值。5. 解析: 选项A)中定义函数时,形参的类型说明应该放在形参表列内说明。老版本C语言中,对形参类型的声明是放在函数定义的第2行,也就是不在第1行的括号内指定形参的类型,而在括号外单独指定。选项B)中return后面的值可以是一个表达式。选项D)中实参与形参的类型应相同或赋值兼容。如果

4、实参为整型而形参为实型,或者相反,则按不同类型数值的赋值规则进行转换,以形参类型为准。6. 解析: 在main函数中,对f(1)和f(2)的值进行了累加。 f(1)=1 f(2)=f(1)+1=2最后,j的值为1+2=37. 解析: C语言规定,一个函数中调用另一个函数(即被调用函数)需要具备的条件有:首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。如果使用库函数,一般还应该在本文件开头用#include命令将函数调用有关库函数时所需要到的信息“包含”到本文件中来。如果使用自定义函数,而且该函数与调用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数作声明,即向

5、编译系统声明将要调用此函数,并将有关信息通知编译系统。在C语言中,可以使用函数原型进行声明,函数原型的一般形式为:函数类型 函数名(参数类型1,参数类型2)或函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2)8. 解析: 在C语言中,对于自定义函数要遵循“先定义,后使用”的规则,如定义时,不指定函数类型,C编译系统都默认函数的返回值是int型。9. 解析: 在C语言中,对于返回值是其他类型的函数,若把函数定义放在调用之后,应该在调用之前对函数进行说明,或称为函数原型说明。函数说明句中的类型必须与函数返回类型一致,函数说明可以是一条独立的语句,也可以与普通变量一起出现在同一个语句中。

6、对于函数值为整型的函数的说明,prtchar中定义时是void类型,那天返回值与kprtchar();矛盾。所以本题的错误之处在于“函数说明和函数调用语句之间有矛盾。”10. 解析: C语言在函数中说明的变量为局部变量,只在函数内起作用但不会影响到其他函数。所以在不同的函数中使用相同的函数名不代表是同一函数,A)项正确。在函数定义时声明的参数只在函数内部起作用,是函数的局部变量,B)正确。在一个函数中定义的变量是这个函数的局部变量,所以只在这个函数内起作用,C)正确。复合语句中定义的变量其作用域是这个复合语句,不会扩大到整个函数,所以D)项错误。11. 解析: 用户调用标准库函数前不必重新定义

7、,而只需使用预编译命令将该函数所在文件包括到用户源文件中即可。而且,系统允许用户重新独定义标准库函数,但此时该函数将失去原有含义。因此,正确答案为选项B)。调用函数时,必须要注意以下语法:函数名必须与所调用的函数名字完全一致;实参的个数与形参的个数一致;函数必须先定义,后调用。如果被调用的函数的返回值为int型或char型,则被调用函数的定义也可以放在调用的位置之后。如果在函数调用之前没有对函数作声明,则编译系统会把第一次遇到的该函数形式作为函数的声明,并将函数类型默认为int型。12. 解析: 有参函数的定义一般形式是:类型标识符 函数名(形式参数表列) 声明部分 语句形式参数之间是以逗号“

8、,”隔开,本题的double fun(int x,int y)语句后没有任何符号。13. 解析: 本题考查的函数形参与实参的传递规则,当形参与实参都是简单的数据类型时,形参值的改变不能影响实参值的改变,即本题中c的值未改变,仍然是6。14. 解析: 函数调用相当于f(2,3),程序运算应得结果为“-1”。15. 解析: C语言中的函数可以进行递归调用,但是不能在函数中定义函数,函数不必要有返回值,若有返回值,则返回值类型必确定。16. 解析: 本题考查函数中变量的作用范围,在主函数中给变量x,y,z赋值,然后将其作为实参传递给了函数fun(),虽然在函数fun()中改变了这3个变量的值,但只是

9、同名的局部变量,不影响函数中变量的值,所以在调用函数fun()结束后,主函数3个变量的值未改变,即形参值的改变不能影响实参的值。17. 解析: 函数返回语句return中返回的是一个指针的值也就是一个地址,所以返回的是形参p中存放的地址值。18. 解析: C语言中关于形参与实参的说明:实参可以是常量、变量或表达式;实参与形参的类型应相同或赋值兼容,实参类型可以为C语言中的任何一种数据类型,而形参不能是常量或表达式,只能是某种类型的变量。19. 解析: 该题考查的是递归函数的调用,题中读fun函数进行了递归调用,第1次调用:fun(3)n=3 s=3-fun(2)第二次调用时:fun(2)n=2

10、 s=2 返回第一次调用后,s=3-2=1。20. 解析: 在C语言中,函数首部的一般形式为:函数类型标识符 函数名(参数类型1 参数名1,参数类型2 参数名2.)本题中,选项A)不属于C语言的写法,是PASCAL语言中函数首部的写法,选项D)是BASIC语言中的写法,选项B)中的变量b前缺少类型的定义。21. 解析: 函数调用的一般形式为:函数名(形参表)若函数无形参,调用形式为:函数名(),当所调用的函数用于求出某个值时,函数的调用可作为表达式出现在允许表达式出现的任何地方,本题中调用语句的参数个数为2个。22. 解析: 本题题设的函数定义中,在函数名前没有函数返回值的类型名,按照C语言的

11、规则,缺省函数返回值类型默认为int型。23. 解析: C语言容许函数返回一个值,通过return语句实现,其格式是:return(表达式);或 return 表达式;功能是把表达式的值带回主调函数的调用处,作为函数的返回值。函数返回值的类型以函数类型为准,为了明确表示“不带回值”,可用“void”类型说明符定义“空类型”。在以下几种情况下,可不在调用函数中对被调用函数类型声明:如果函数值是整型或字符型,可不进行声明,系统自动默认函数值是整型。如果被调用函数的定义出现在调用函数之前,可不进行声明。24. 【命题目的】考查对于函数的基础知识的掌握情况。【解题要点】函数不一定有返回值(void类型

12、),C语言规定,在一个函数的内部不能再定义函数,函数可以递归调用,一个C程序允许由多个文件组成,C语言支持函数的外部调用,不一定有调用关系的所有函数都放在同一个源程序文件中。【错解分析】选项A)函数不一定有返回值,选项B)函数不可以嵌套定义,选项D)函数可以外部调用。【考点链接】C语言函数间传递参数规则是值传递,即单向传递。25. 【命题目的】考查对于函数调用的语法要求掌握的情况。【解题要点】如果没有指明函数值类型,则默认函数返回值的类型为int型。【错解分析】这个题目实现的是m,n的立方差。【考点链接】C程序中,函数可以直接或间接地调用自己。26. 【命题目的】考查对于函数说明的掌握情况。【

13、解题要点】函数说明语句中的类型名必须与函数返回值的类型一致。【错解分析】这个题目实现的是在字符A的ASCII码值上加上一个常数,使之变成另一个ASCII码值,从而输出字符。【考点链接】字符在进行数学计算的时候都是以ASCII码值的形式计算。27. 【命题目的】考查对于函数定义语法掌握的情况。【解题要点】函数定义的格式如下:一般形式为,函数返回值的类型 函数名(类型名 形式参数1,类型名 形式参数2,)函数体,老版本的C函数的定义形式为:函数返回值的类型名 函数名(形式参数1,形式参数2,)形式参数类型说明;函数体。【错解分析】选项B)应改为double add (double a,double

14、 b),选项C)应在定义形参时用逗号分隔;选项D)应将形参的类型说明放在函数体外。【考点链接】定义的函数可以没有形参,但函数名后的一对圆括号不能省略。填空题1. 【命题目的】考查对于函数的调用和返回值的掌握情况。【解题要点】函数调用的时候,函数名字必须与所调用的函数名完全一致,形参与实参类型要一致,在没有给出函数返回值类型的情况下,默认为整形,当返回值为整型的函数放到主函数后面时,可以不需要事先说明就调用这个函数。【考点链接】retrun既可以返回一个普通常量,也可以返回一个指针变量。2. 解析:本题中,欲求p的值,需要先求m,n,m-n的阶乘值,可用循环语句实现。第章 指针选择题1. 解析:

15、 “&”是求址运算符,“*”是指针变量的说明符,说明该变量只能存放所定义类型变量的地址。本题中选项D)中均代表地址,注意&*point等价于point。2. 解析: 尽管C语言以传值方式进行函数调用,但也可以通过传递指针的值(变量的地址)来达到修改实参变量值的目的,这是此题主要说明的问题。其次,应注意表达式*(z+)的值是*z,其后的z+在程序中无实际作用。函数调用时,由于x,y和z分指向a,b和c,因此,*x,*y和*z就是a,b和c。第一次调用函数时,*x=a=10,*y=b=40,*z=c=20输出结果为11,41,20,至此,已经可以肯定选项B)是正确的。在第一次输出后

16、,a=11,b=41,c=20,第二次输出为:12,42,20。3. 解析: 本题考查函数返回值的知识。函数返回值是通过函数中的return语句获得,return语句中的表达式的值就是所求函数的值。此表达式的值必须与函数首部所说明的类型一致。若类型不一致,则以函数值的类型为准,由系统进行转换。4. 解析: 通过定义语句int*p后,p本身就是一个整型指针,p=&n是使p指向变量n,p本身就是一个地址,在用输入时不需在取地址了。5. 解析: 选项A),B),C)的指针赋值表达方式都不正确,*p5表达整数5放到指针p所指向的存储单元中。6. 解析: 在函数体语句中的b+=*a;的*是指针运

17、算符(也称间接访问运算符),*a就是main函数中a的值。7. 解析: int a,b,k=4,m=6,*p1=&k,*p2=&m;声明整型变量a,b,k,m和指针p1,p2,并分别将4和6赋给k和m,将k和m的地址赋给p1和p2;a=p1=&m;等价于a=(p1=&m);将p1是否等于地址m的值(0)赋给变量a,b=(*p1)/(*p2)+7;该句的含义是将后面表达式的的值7赋给变量b。8. 解析: 该程序的执行过程是:首先声明整型指针变量p和整型变量i,字符型指针变量q和字符型变量ch,将i的地址赋给指针变量p,将ch的地址赋给指针变量q,将40赋给*p,此

18、时,q已经指向了一个具体的存储单元,但ch的值不确定,即*p没有确定的值,所以不能执行*p=*q语句。9. 解析: “&”是求址运算符,“*”是指变量说明符。选项A)、B)应改为scanf(“%d”,p);选项C)中指针变量p未指向一确定的内存单元,不能为其赋值,并且这样做很危险建议不使用。10. 解析: p=&a表达式的含义是将变量a的地址赋给指针变量p;a=*p+b表达式的含义是指针变量p所存地址对应的值与b的和赋给a。11. 解析: 指针变量m和z分别指向整型变量y,i,所以这两个指针变量中存储的地址是不同的,变量x接受的是一个关系运算的结果,因为两个地址是不同的,所以相

19、等的判断结果为0。12. 解析: 本题的选项A)和B)犯了一个同样的错误,即指针变量p定义后并没有指向具体的变量。也就是说,p中没有确定的地址值,它的值是不可预见的,所指向的单元也是不可预见的,因此不能进行赋值操作。另外,在选项D)中,s是int型指针变量,p是char型指针变量,所指向的内存单元所占用的字节数是不同的,因而不能将字符指针变量p的值赋给整型指针变量s。13. 解析: 在C语言中,调用函数不可能改变实参指针变量的值,但可以改变实参指针变量所指变量的值。了解了实参指针变量的改变情况,本题只剩下简单的“加减法”了。14. 解析: 解答本题时,首先我们应该明白“&”运算符和“*

20、”说明符的含义,+N说明的是对变量N的自增运算,本题中+*x要求先给指针变量x自增1,再指向其他地址,结果为26。15. 解析: 本题函数fun中形参是两个指针变量,函数fun只是将这两个指针的指向的地址交换了一下而并没有交换它们所指向的地址中的数据。虽然,主函数中声明的变量a,b是整型变量而函数fun中的形参是两个指针变量,这两个变量仅仅是两个参数,与主函数中的那两个变量含义是不同的。16. 解析: 本题应该把swap()函数改成这样:swap(int *p,int *q) int t;t=*p;*p=*q;*q=t;这时执行程序时,先将a的地址传递给指针变量p,b的地址传递给指针变量q,然

21、后将*p(a的值)的值传递给t,将*q(b的值)传递给*p,将t的值传递给*q,从而将a和b互换。17. 【命题目的】考查对于指针说明的掌握情况。【解题要点】定义指针变量的一般格式为:类型名 *指针变量名1,*指针变量名2,;指针可以通过求地址运算符(&)获得地址值,还可以通过指针变量获得地址值。【错解分析】选项A)定义的不是一个指针,而是一个类型变量;选项B)定义的是指针,但是赋值给指针应该是一个地址值;选项D)定义的是指针,但是赋值与选项B)的错误类似,a不是指针型的变量,加了*号没有意义。【考点链接】指针变量必须区分基类型,基类型不同的指针变量不能混合使用。18. 【命题目的】考

22、查对于指向指针的指针的掌握情况。【解题要点】*t中的t表示指向指针的指针。【错解分析】选项A)指向char变量的指针应该是*t。19. 【命题目的】考查形参为指针变量时,实参和形参之间的数据传递。【解题要点】通过传送地址值,在被调用函数中直接改变调用函数中的变量值。【错解分析】本题目是将指针指向的变量x,y的地址传给了函数fun(),在fun函数中对x,y的内容进行了修改,这样就改变了原先x,y的值。【考点链接】通过传送地址值,在被调用函数中直接改变调用函数中的变量值,是又一种函数之间传递数据的重要手段。20. 【命题目的】考查函数返回地址值的掌握情况。【解题要点】函数的返回值的类型不仅可以是

23、简单的数据类型,而且可以是指针类型。【错解分析】在函数内部实现的相当于是y=x+y-3。【考点链接】函数值的类型可以是整型、实型、字符型和指针型。填空题1. 解析: C语言中实参变量和形参变量的数据传递是单向的“值传递”方式。指针变量作函数也要遵循这一规则。调用函数不可能改变实参指针变量的值,但可以改变实参指针变量所指变量的值。2. 【命题目的】考查对于函数的地址传递的掌握情况。【解题要点】通过地址传递可以在被调函数中对调用函数中的变量进行引用。3.第章 数组选择题1. 解析: x数组共有10个元素,在花括弧内只提供3个初值,这表示只给前面的3个成员赋值,后7个元素的值为0,所以,一共有20个

24、字节。2. 解析: 本题中,表达式将5个初值赋给a0至a4,后面的部分,将自动会被依次补零处理。3. 解析: 本题考查二维数组的基本概念。对于二维数组,只可以省略第一个括号中的常量表达式,而不能省略第二个括号中的常量表达式。第一维的大小按以下规则决定:当初值的个数能被第二维的常量表达式的值除尽时,所得商数就是第一维的大小。当初值的个数不能被第二维的常量表达式的值除尽时,则:第一维的大小=所得的商数+1数组中未赋初值的元素系统会自动对它们赋初值0。4. 解析: 本题经过定义语句和赋值后,p表示的是变量a的地址,*p表示的是变量a的值。5. 解析: 在C语言的数组元素的引用方法,我们在前面已经讲过

25、了,比如数组元素a0,可以用表达式*(p+0),即*p来引用,对于数组元素a1,可以用表达式*(p+1)来引用,在这里,p+1的值就是数组元素a1的地址,对此地址使用“间接访问运算符”:*(p+1)就代表存储单元a1,注意:一对圆括号不可少。同样,对于数组元素a2,则可以用表达式*(p+2)来引用,对于数组元素a9,可以用表达式*(p+9)来引用。因此,当指针变量p指向a数组的起始地址时,若0i10,则数组元素a i可以用*(p+i)来表示。6. 解析: 函数定义的一般形式为:类型说明符 函数名() 类型说明 语句根据fun函数的调用语句可知,fun函数的第二个参数是一个地址值。7. 解析:

26、本题定义a为3行×4列的数组,它可用的行下标最大为2,列下标最大为3,用a04超过了数组的范围,注意数组的下标是从零开始的。8. 解析: 在C语言中,对于数组元素下标的定义只能是整型常量或整型表达式。9. 解析: 函数之间数据传递的过程是一个赋值过程,实参将值赋予对应的形参。函数的实际参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传递到另一个函数中。当数组名作参数时,如果形参数组中的各元素的值发生变化,实参数组元素的值随之发生变化。10. 解析: C语言中,实参变量和形参变量之间的数据传递是赋值过程、是单向的“值传递”方式。指针变量作函数参也要遵

27、循这一规则,调用函数不可能改变实参指针变量的值,但可以改变实参指针变量所指变量的值。11. 解析: 如果定义数组时没有进行初始化,则其各个成员的值不确定,所以ks1*10的值也不定。12. 解析: 请注意:该题目所要求的是最大数的位置(下标),而不是最大数的数值!因此,在进行逐个比较的过程中,需要记录下的是最大数的下标i,根据给出的程序可知,该下标记录在变量p中,所以,如果ai>ap这一关系成立,应该把i的值值赋给p,这样才满足题目的要求。13. 解析: 我们可以把二维数组的常量表达式看做是矩阵或者表格的行数与列数,要注意每个元素有两个下标,第一个是方括号中的下标代表行号,称行下标;第二

28、个是方括号中的下标代表列号。行下标和列下标总是从0开始的,二维数组在不赋初值时,不能得到确定。14. 解析: 本题中,a12是二维数组中的第6个元素,对应for循环中i的值为5,p5=5+1。15. 解析: 本题中的二维数组的每个元素就是一个由三个元素构成的一维数组,根据条件for(k=0;k<3;k+)和要求的akk可以得出本题的答案应该是9 5 1。16. 解析: 在C语言中,数组元素是从0开始的。指针变量p指向数组的首地址,(p+2)就会指向数组中的第3个元素。题目中要求输出的是元素的值。17. 解析: p=&a3将指针指向数组a的第4个元素,p5指向数组a的第9个元素,而

29、a8=9,所以b=9。18. 解析: 通常,引用一个数组元素可以用下标法,如ap-a形式,或指针法,如*(&ai)的形式。本题中a9=9,a10显然超出了数组范围,注意,数组的下标是从0开始的。19. 解析: 在一维数组中要注意的是作为下标表达式的常量表达式的值必须是大于等于0,选项B)中定义有5个元素,但赋初值时有6个元素,所以是错误的。20. 解析: 本题的知识点主要是:在C语言中,数组元素下标是从0开始的;指针变量p指向数组的首地址。for循环语句中,指针变量p始终指向数组的首地址,因而执行循环赋值语句后数组各元素的值均变为2。21. 解析: 在main函数中,调用reverse

30、函数将b数组中的前8个成员进行互置,执行完毕后,b数组中的成员为8,7,6,5,4,3,2,1,9,10,然后再执行for循环结构,将b6,b7.b9的值相加,结果为22。22. 解析: 本题考查二维数组的定义方式。第一维的大小由以下方法判断:当初值的个数能被第二维的常量表达式的值除尽时,所得商数就是第一维的大小;2)当初值的个数不能被第二维的常量表达式的值除尽时,则第一维的大小=所得的商数+1。23. 解析: 在一维数组中要注意的是下标表达式的常量表达式的值必须是大于等于零,并且小于自身元素的个数,既数组长度,选项B)的下标不是整数,所以错误24. 解析: 本题考查数组指针的应用。选项D)第

31、一层括号中为数组a中第i项元素的值,外面再加指针运算符没有意义。25. 解析: 指针变量p指向数组a的首地址,并把指针变量p的地址赋于指向指针的指针变量k。26. 解析: 此题的关键是要分清指针数组与指向一组数组指针之间的不同,题中的说明语句定义了一个指针变量prt,它指向包含三个整数元素的一维组数。应注意:*prt两侧的圆括号不能缺少,如果写成*ptr3,则p与3先结合,是数组,然后再与前面的*号结合,则*ptr3将是一个指针数组。27. 解析: 函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中去。在本题解析中,我们试图将这一问题解

32、释清楚!大家可以考虑一下利用下面这函数可不可以实现a和b的互换。swap(x,y)int x,y; int t; t=x; x=y; y=t;如果在main函数中用swap(a,b),会有什么结果呢?在函数调用开始时,a的值传送给x,b的值传递给y 。执行完swap函数后,x和y的值是互换了,但main函数中的a和b并未互换。也就是说由于“单向传递”的“值传递”方式,形参值的改变无法传递给实参。为了使在函数中改变了的变量值能被main函数所用,不能采取上述把要改变值的变量作为参数的办法,而应该用指针变量做函数参数。在函数执行过程中使指针变量所指向的变量值发生变化,函数调用结束后,这些变量值的变

33、化被保留下来,这样就实现了调用函数改变变量的值,在主调函数中使用这些改变了的值的目的。swap(p1,p2)int *p1,*p2; int p; p=*p1; *p1=*p2; *p2=p;注意交换*p1和*p2的值是如何实现的,如果写成下面这样就有问题了!swap(p1,p2)int *p1,*p2; int *p; *p=*p1; /*此语句有问题*/ *p1=*p2; *p2=*p; *p1就是a,是整型变量。而*p是指针变量p所指向的变量,但p中并无确切地址,用*p可能会造成破坏系统的正常工作状态。应该将*p1的值赋给一个整型变量,用整型变量作为过渡变量实现*p1和*p2的交换。请注

34、意,不能企图通过改变指针形参的值而使指针实参的值也改变swap(p1,p2)int *p1,*p2; int *p; p=p1; p1=p2; p2=p;程序的原意是:交换两个指针的值。但是语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。指针变量做函数参数也要遵循这一规则。调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指向变量的值当然,明白了以上指针变量的调用方式后,本题便可迎刃而解。28. 解析: 该程序先判断ai<ap,如果条件为真,则ai比当前的设定的最小值小(p保留的当前最小元素的下标),那么将i赋给p即将比较过的最小的元素下标保留在p中,作为下面判断的

35、标准。29. 解析: aij元素之前有i行元素(每行有m个元素),在aij的前面还有j个元素,因此aij之前共有i*m+j个元素。30. 解析: 本题综合考查一维数组和多维数组指针变量的表示方法。在C语言中,引用数组元素的方法有两种,即:下标法和指针法。下标法如ai形式;指针法如*(a+i)或*(p+1)。其中a是数组名,p是指向数组的指针变量,其初值p=a。再如*(*(p+2)+2)是a22的值,注意语句中指针型数组的书写格式,不能写成“(*数组名)长度”,因为这是定义指向含有“长度”个元素的一维数组的指针变量。例如有定义语句“int a,b,c,c,*p3=&a,&b,&a

36、mp;c;”,它定义了一个名为p的指针型数组,其个元素p0,p1,p2分别指向f3个整型变量a,b,c。31. 解析: 二维数组初始化时允许只对部分元素赋初值,其余自动为0。32. 解析: 第五行处的输入值格式和定义不一致,定义的为float类型a3,输入值格式为scanf(“%f”,&ai);如果定义的为int类型a3,则输入值格式为scanf(“%d”,&ai)。33. 解析: C语言中规定二维数组的初始化定义数组时对第一维的长度可以不指定,但第二维的长度不可以省略类型不可以省略。34. 解析: 本题用循环的方法考查对数组概念的掌握。首先,当i=0时,数组中的位置是a20=

37、7,当然,如果用排除法的话,就不用考虑后面的循环了,因为在4个选项中,第1个数为7的选项只有B)。本题执行第2次循环时,i的值为1,则printf函数中的数组指向为a11=5,依次循环,可求出答案。35. 解析: 关于二维数组的初始化,我们需要掌握如下方法:所赋初值个数与数组元素的个数相同;所赋初值行数少于数组行数时,系统将自动给后面各行的元素补初值0;在给二维数组赋初值时可以不用行花括号对。选项C)应该是int a32=1,2,3,4,5,6;36. 解析: 若定义数组为an,则下标为从0到n-1,显然选项A)错误;选项B)中形式为引用二维数组元素的格式;C语言中元素下标放在中括号里。37.

38、 解析: 本题中直接使用指针变量k,但在使用时要注意对k的指针运算,此外,一开始应认*k的值为数组中的某一下标值,即*k=0,本函数的功能是找出数组中的最大元素的位置及最大元素的值。38. 【命题目的】考查对于一维数组元素引用的掌握情况。【解题要点】在引用一维数组元素时只能有一个下标,引用形式为:数组名下标表达式,在C语言中,一个数组不能整体引用,在引用数组元素时,数组元素中下标表达式的值必须是整数,下标表达式的下限为0。【错解分析】选项A)超过了数组定义的范围,因为下标表达式的下限值为0,上限值为9;选项B)不能整体引用一个数组元素;选项C)与选项B)是同样的错误。【考点链接】一个数组在内存

39、中占有连续的存储单元。39. 【命题目的】考查对于一维数组的定义方法的掌握情况。【解题要点】在C语言中,定义一维数组的语句一般形式为:类型名 数组名常量表达式。【错解分析】选项B)和D)都是常量表达式的一种,选项C)不是常量。【考点链接】整型常量或整型表达式允许作为数组下标的数据类型。40. 【命题目的】考查数组的综合运用。【解题要点】读懂两个循环的关系,是解这个题目的关键,本题的第一个for循环的作用是实现对数组元素的遍历,第二个循环的作用是排序。【错解分析】while(j>=0 && t>cj),这个语句是控制排序的关键语句,它即实现了比较两个元素大小的作用,又

40、实现了元素向后移动的作用,不断地把大的数据向前移动,直到找到一个比它小的,或到数据的上界为止。【考点链接】getchar()和putchar()函数的用法。41. 【命题目的】考查对于通过地址来引用二维数组元素的掌握情况。【解题要点】数组a55,0<=i<5,0<=j<5,则可以用五种表达式来引用,aij,*a(ai+j),*(*(a+i)+j),(*(a+i)j,*(&a00+5*i+j)。【错解分析】数组的下限为0,%后面为小写的x,所以输出的结果为小写字母表示的十六进制。【考点链接】如果%后面用大写的X则输出用大写的字母表示,否则用小写字母表示。填空题1.

41、 解析: 在函数中,可以通过指针变量来引用调用函数中对应的数组元素,此操作是通过传递数组的首地址来实现。2. 解析: 解答本题的关键是要读懂程序,试题要找出能被7或11整除的所有整数,注意数学中的“或”和C语言中的“或”的区别,但在此处,if条件语句中用了“|”运算符,若要找能同时被7和11整除的所有整数则在if()中应用“&&”运算符。当然,如果m的值输入50,即表达式fun(10,aa,&n);为fun(50,aa,&n);时输入结果为:7 11 14 21 22 28 33 35 42 44 49。3. 【命题目的】考查对于数组操作的综合运用。【解题要点】

42、深刻理解十进制转化为二进制的方法,即取余法;数组名作为实参,在函数内部可以直接修改调用函数中定义的数组的值。【考点链接】dowhile循环,先执行循环体,后判断循环条件。第章 字符串选择题1. 解析: 字符型指针变量p中存放的是“china”的首地址,所以选项A)和B)错误。s数组长度为6,而p所指向的字符串长度为5,二者不相等,排除选项C)。2. 解析: 在本题中,while(*p2=*p1)!= 0)有两个作用,一个是判断条件是否成立以决定是否再次进入循环,另一个作用是判定前先完成*p2=*p1,该处的作用是把p1所指存储单元的字符逐一送p2所指存储单元中,直到p1所指单元内容为0为止。3

43、. 解析: 在内存中,字符数据以ASCII码存储,它的存储形式就与整数的存储形式相类似。C语言使字符型数据和整型数据之间可以通用。也可以对字符数据进行算术运算,此时相当于对它们的ASCII码进行算术运算,在本题中,s+相当于s=s+1,即让s指向数组中的下一个元素。4. 解析: 函数调用的一般形式为:函数名(实参列表)首先调用函数func1(0),输出st0=h。i值变为2,并调用函数func2(2),输出st2=l。i值此时变为4,又调用函数func1(4),输出st4=0。此时i值大于等于3,执行完毕。因此,输出结果为hlo。5. 解析: C语言中操作一个字符串常量的方法有:把字符串常量存

44、放在一个字符数组之中;用字符指针指向字符串, 然后通过字符指针来访问字符串存贮区域。当字符串常量在表达式中出现时, 根据数组的类型转换规则, 它被转换成字符指针。本题D)项中错误的关键是对数组初始化时,可以在变量定义时整体赋初值,但不能在赋值语句中整体赋值。6. 解析: 本题考查指向字符串的指针的运算方法。指针变量p首先指向字符串中的第一个字符A,执行p=s+1后,p指向字符串中的第二个字符B,然后输出值“BCD”并换行。依次执行循环语句。7. 解析: 函数strcpy的功能是字符串拷贝,用法char *strcpy(char *str1,char *str2),作用是将字符串2复制到字符串1

45、中去。二维数组可以看做是一种特殊的一维数组,它的元素又是一个一维数组。本题把 arr看做是一个一维数组,它有两个元素:arr0,arr1,每个元素又是一个包含4个元素的一维数组。8. 解析: 本题考查用strlen函数计算字符串长度的方法。该字符串中包含的字符是:t(跳格符)、"(双引号)、065(ASCII值为八进制065,也即十进制为51的字符)、xff(ASCII值为十六进制ff,也即十进制为255的字符)、n(换行符)。9. 解析: 如果一个字符数组用来存储字符串,那么在定义该字符数组时,数组的大小应该比它将要实际存放的字符串长度大1,所以选项A)和B)错。选项D)s本身就是

46、一个字符指针,不需再取地址。10. 解析: 在给数组赋值时,可以用一个字符串作为初值,这种方法直观,方便而且符合人们的习惯。数组array的长度不是5,而是6,这点必须要注意。因为字符串常量的最后由系统加上一个0,因此,上面的初始化与char array=C,h,i,n,a,0;等价。11. 解析: 本题考查知识点有二:字符串常量是由双引号括起来的一串字符,虽然C语言中没有字符串数据类型,但却允许使用“字符串常量”,每一个字符串常量都分别占用内存中一连串连续的存储空间,这些连续的存储空间实际上就是字符型一维数组。如果一个字符数组用来作为字符串使用,那么在定义该字符数组时,数组的大小就应该比它将

47、要实际存放的字符串多一个元素。12. 解析: 本段程序的作用是输出字符串“lanuage”中字母u之前的字符,并将其转化为大写字母。注意:如果一个字符数组用来作为字符串使用,那么在定义该字符数组时,数组的大小就应该比它将要实际存放的最长字符多一个元素,以存放0。13. 解析: 考查指向字符串的指针变量。在该题中,指针变量p指向的应该是该字符串中的首地址,p+3指向的是字符串结束标志0的地址,因而*(p+3)的值为0。14. 解析: 本题首先通过第一个while循环计算字符串a的长度,再通过第二个循环,将字符串a和b相连,最后返回连接后的总长度。15. 解析: gets函数和puts函数是库函数

48、,必须包含的头文件是stdio.h16. 解析: 本题考查两个知识点:strlen函数的功能是求字符串的长度,并返回字符个数,不计最后的0,strcpy函数的功能是把后面的字符串复制到前面字符串所指向的空间。17. 解析: 选项A)char *a;*a="china"应改为char *a;,选项B)应该是char str6;D)项表述方法有错误。18. 解析: sizeof是求字节运算符,在字符数组a中,0也作为字节保存,是a数组的一个成员,所以sizeof(a)的值应为9,strlen是测试字符串长度的函数,函数的值为字符串中的实际长度,不包括0在内所以strlen(a)

49、的值为8。19. 解析: 本题题意要求删除所有空格,即除了空格以外的其他所有字符都要留下。由于C语言中没有直接删除字符的操作,所以我们对于删除字符的操作都是采用“留下”字符的算法,以前的题目亦是如此。用stri从串头到串尾逐一走动,每走到一个字符都判断其是否为空格,若不是空格(注意在if()的单引号之间有一个空格),则将其保存strj中。注意j的下标变化、初值及最后加串结束符0。20. 解析: 本题综合考查字符数组的赋值和strcpy函数的用法。C语言不允许用赋值表达式对字符数组赋值,如下面的语句就是非法的:str1="China",如果想把“China”这5个字符放到数组

50、str1中,除了逐个地输入外,还能使用strcpy函数,该函数的功能是将一个字符串复制到一字符数组中。例如:strcpy(str1,“China”);或strcpy(str1,str2);注意,不能企图用以下语句来实行赋值(将str2的值传给str1):str1=str2;不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。strcpy函数的结构是:strcpy(字符数组1,字符串2)其中,需要注意的是,字符数组1的长度不应小于字符串2的长度,“字符数组1”必须写成数组名形式,如(str1),“字符串2”可以是字符数组名,也可以是字符串常量,不能用赋值语句将一个字符串常量或字符数组直接

51、给一个字符数组。21. 解析: 当执行输入时,把整数赋给字符型变量c(整型与字符型能相互转化),把23赋给整型变量i,把456赋给字符数组s,789之所以没有被接受是因为字符串输入时,遇空格结束。22. 解析: 本题考查字符串数组和指针的引用方式。在C语言中,系统在每个字符或数组的最后自动加入一个字符0,作为字符的结束标志,在本题中,char a=“It is mine”;所表示的a字符串实际含有11个字符。23. 解析: 本题考查的重点是拷贝字符串使用strcpy()函数,该函数的调用方式是:strcpy(字符数组, 字符串)其中“字符串”可以是字符串常量,也可以是字符数组。函数的功能是:将

52、“字符串”完整地复制到“字符数组”中,字符数组中原有内容被覆盖。使用该函数时注意:字符数组必须定义得足够大,以便容纳复制过来的字符串。复制时,连同结束标志0一起复制。不能用赋值运算符“”将一个字符串直接赋值给一个字符数组,只能用strcpy()函数来处理。另外,本题还考查连接字符串的strcat()函数,其调用方式是:strcat(字符数组, 字符串)功能是把“字符串”连接到“字符数组”中的字符串尾端,并存储于“字符数组”中。“字符数组”中原来的结束标志,被“字符串”的第一个字符覆盖,而“字符串”在操作中未被修改。使用该函数时注意:由于没有边界检查,编程者要注意保证“字符数组”定义得足够大,以

53、便容纳连接后的目标字符串;否则,会因长度不够而产生问题。连接前两个字符串都有结束标志0,连接后“字符数组”中存储的字符串的结束标志0被舍弃,只在目标串的最后保留一个0。24. 解析: 该题稍微难一点。主要要搞清楚以下几点:定义了一个指针数组char *p2后,程序中第一个循环for(i=0;i<2;i+)pi=chi;的作用,是使指针数组的p0元素(它本身是一个指针)指向了二维数组ch的第一行字符串,并使指针数组的p1元素指向了二维数组ch的第二行字符串,这样,就使指针数组p和二维数组ch建立起了一种对应关系,以后对二维数组ch的某个元素的引用就有两种等价的形式:chij或pij。对二维

54、数组ch的初始化,使其第一行ch0中存入了字符串“6937”,第二行ch1中的内容为字符串“8254”。程序中第二个循环中的循环体s=s*10+pij-0;的功能是这样的,每执行一次,将s中的值乘以10(也即,将s中的数值整体向左移动一位,并在空出来的个位上添一个0),再将当前pij中的字符量转换为相应的数字,然后把这个数字加到s的个位上。注意到内层循环的循环条件pij>0是指pij中的字符只要不是字符串结束标志0就继续循环,语句j+=2;是使下标j每次增加2,也即一个隔一个地从pi所指向的字符串中取出字符。经过上述解析后,不难看出,该程序首先从p0所指向的字符串“6937”中一个隔一个

55、地取出字符,分别是6和3,然后从p1所指向的字符串“8254”中一个隔一个地取出字符,分别是8和5,同时经过转换和相加运算后,结果s中的值应该是6385,所以,正确答案是C)。25. 解析: while语句的一般形式为: while(表达式)语句; 其中表达式是循环条件,语句为循环体。while语句的语义是:计算表达式的值,当值为真(非0)时, 执行循环体语句。本题中逻辑与符号连接的表达式值为真,*str2+=*str1+语句是将str1的内容逐个复制到str2字符串。26. 解析: 对于字符串指针,其保留的是整个串的首地址,即为第一个字符的起始地址,当该指针做算术运算时,就是该指针根据其类型

56、向后移动相应的存储空间。27. 解析: 该定义中指明的是含有两个元素的字符数组指针,对数组存放的都是首地址即串中的第一个字符的地址。28. 解析: 本题中,格式符0表示的是八进制无符号形式输出整型数(不带前导0),字符常量在内存中占一个字节,存放的是ACS码代码值。C语言规定,所有字符常量都作为整型量来处理,在计算机内部,其对应的整数值就是ACS字符集中该字符的序号,即&*s中有几个字符就输出几个*。29. 解析: C语言规定了一个字符串结束标志,以字符0代表,在遇到0时,表示字符串结束,由它前面的字符组成字符串。30. 【命题目的】考查对于字符数组的赋值的掌握情况。【解题要点】通过赋

57、初值的方式给一维数组赋字符串,可以用给一般数组赋初值的相同方式给一维字符数组赋字符串,也可以在赋值时直接赋字符串常量。【错解分析】选项B)和C)后面的0是多余的,不过也不错,在C语言中,系统会自动在字符串的结尾处加上一个字符0作为串的结束标记。【考点链接】注意,要有足够的空间来存放字符串。31. 【命题目的】考查对于用一个一维字符数组来存放字符串的掌握情况。【解题要点】在C语言中,通过使用库函数允许对字符数组进行整体输入/输出。【错解分析】C语言不允许通过赋值运算符对字符数组整体进行赋值,对字符串使用符号=只能在说明字符数组并进行初始化的时候进行。【考点链接】字符串结束标志为0,计算字符串的实际长度时不计入串长。32. 【命题目的】考查对于用于字符串处理的函数的掌握情况。【解题要点】字符串复制函数strcpy调用形式为:strcpy(s1,s2),此函数用来把s2所指字符串的内容复制到s

温馨提示

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

评论

0/150

提交评论