精品教育的倡导者饮水思源·感恩戴德做一个有责任心,有耐心,有爱心的老师使我们源恩教育每一位老师的追求。第5章函数5.1函数的定义、库函数(1)【答案】B)【解析】程序执行strcpy(a+1,b+2)后,字符数组a的值为“a2”,再进行字符串的连接strcat(a,c+1),此时字符数组a的值为“a2yz”。(2)【答案】A)【解析】C语言规定,函数必须先定义,后调用(函数的返回值类型为int或char时除外)。在选项A)中,调用的子函数在调用后面定义,所以不正确。在选项B)、C)中,被调用函数在主函数之前定义,再在主函数中调用,所以是正确的;在选项D)中,在主函数中先对子函数floatfun(inti,intj)进行了声明,然后进行调用。(3)【答案】D)【解析】一个C语言源程序可以由一个或多个源文件组成,每个源文件可由一个或多个函数组成,这些函数可以是自定义函数,也可以是库函数,各个函数之间没有主从关系,不能嵌套定义函数。(4)【答案】B)【解析】字符串长度函数strlen(s)表示计算出以s为起始地址的字符串的长度,并作为函数值返回。这个长度值不包括串尾的结束标志’\0’。(5)【答案】A)【解析】字符串比较函数strcmp的功能是对s1和s2所指字符串进行比较。如果s1s2,返回负数,如果s1==s2,返回0,如果s1s2,返回正数,所以对于本题来说,能够输出“OK”的语句是选项A)所指的语句。(6)【答案】C)【解析】本题要注意的是转义字符的问题,在字符串s2中,有两个转义字符,分别是回车换行符和反斜线。所以其字符串长度等于5。(7)【答案】C)【解析】在C语言中要对两个字符串的大小进行比较,就需要调用字符串比较函数strcmp(),如果这个函数的返回值等于0,说明两个字符串相等。(8)【答案】A)【解析】函数形、实参传递的时候,要求对应位置类型一致即可,如果实参为函数名,可以定义相应的形参为指向函数的指针变量来获得该函数的入口地址,因此选项B)错误的,在C语言中允许进行递归调用,即自己调用自己,选项C)和选项D)是错误的。(9)【答案】A)【解析】一个C语言源程序可以由一个或多个源文件组成,每个源文件可由一个或多个函数组成,各函数之间是平行的,除了主函数外,函数之间可以相互调用,甚至C语言中的函数可以直接或间接地自己调用自己,称之为递归调用,该调用主要用于把要解决的问题转化为一个新的问题,而这个新问题的解决方法仍与原来的解法相同,只是所处理的对象有规律地递增或递减,可以应用这个转化过程使问题得到解决,同时为了有效使用递归调用必定要有一个明确的结束递归的条件。而每次进行递归调用时候,需要利用栈保存现场信息,因此并不会提高效率,选项C)和选项D)不正确。函数名表名了函数的入口地址,如果函数的形参为指向函数的指针变量,那么对应的实参必须为函数名,因此函数名可以为函数的参数,选项B)错误。(10)【答案】B)【解析】return语句主要用于返回函数的值。在一个自定义函数中,可以根据不同的情况设置多条return语句返回函数的值。(11)【答案】B)【解析】由函数intfun(int*p){return*p;}的定义可知,返回值为整型指针变量p所指向的数据。(12)【答案】C)【解析】函数值通过return语句返回,return语句的形式如下:return表达式或return(表达式);当程序执行到return语句时,程序的流程就返回到调用该函数的地方,并带回函数值。在同一函数内,可以根据需要,在多处出现return语句,在函数体的不同部位退出函数。无论函数体中有多少个return语句,return语句只可能执行一次,返回一个函数值。return语句中也可以不含有表达式,这时必须定义函数为void类型,它的作用只是使流程返回到调用函数,并没有确定的函数值。函数体内可以没有return语句,这时也必须定义函数为void类型,程序的流程就一直执行到函数末尾的“}”,然后返回调用函数,也没有确定的函数值带回。(13)【答案】B)【解析】一个C程序中可以包含任意多个不同名的函数,但只能有一个主函数。一个C程序总是从主函数开始执行。函数的值通过return语句返回,return语句中的表达式的值就是所求的函数值。在C语言中,数据只能从实参单向传递给形参,称为“按值”传递。也即是说,当简单变量作为实参时,用户不可能在函数中改变对应实参的值。5.2函数的调用与函数说明(1)【答案】C)【解析】在语句“k=*f(a,b)”中,由于“()”的优先级高于“*”,所以“*f(a,b);”表示其返回类型为指针的带有两个整型参数的函数,而不是整型数值,因此选项C)为错误的调用形式。(2)【答案】B)【解析】在标准C中,函数的定义形式为:函数返回值的类型名函数名(类型名形式参数1,类型名形式参数2,…){说明部分语句部分}需要说明的是函数名和形式参数都是由用户命名的标识符,在同一程序中,函数名必须惟一,形式参数名只要在同一函数中惟一即可,与其他函数中的变量可以同名。return语句的作用是返回函数的值,在函数中可以出现多个或者没有。(3)【答案】C)【解析】函数说明的一般形式为:类型名函数名(参数类型1,参数类型2,……)。因为函数intfun(doublex[10],int*n)的第1个形式参数是一个双精度型的一维数组,第2个参数是一个整型指针,并返回一个整型值。一维数组的名字表示的是一维数组的地址。(4)【答案】B)【解析】在函数定义的静态变量,只需要赋值1次,即可保存初始值,不需要每次调用时都赋初始值。5.3函数的数据传递(1)【答案】D)【解析】程序考查了函数的调用。对于m=f(f(f(n)));首先计算最内层的函数调用f(n),执行f函数,得到返回值2,然后计算f(2),得到返回值为4,最后计算f(4),得到计算结果为8。(2)【答案】B)【解析】fun(b,c)即fun(5,6),5!=6,所以返回(5+6)/2=5;fun(2*a,5)即fun(8,5),8!=5,所以返回(8+5)/2=6。(3)【答案】C)【解析】本题考查函数的嵌套调用。首先计算f(a,b)与f(a,c),f(a,b)=(b-a)*a=3,f(a,c)=(c-a)*a=6,然后计算f(3,6)=(6-3)*3=9。(4)【答案】C)【解析】由于函数f的作用是对形参x求平方再加1,所以在主函数中,循环第一次执行后变量a的值等于1,第二次执行后,变量a的值等于102,第三次执行后,变量a的值等于503。(5)【答案】B)【解析】在C语言中,函数的实参单元与形参单元在内存中分配不同的存储单元。在调用函数时,给形参分配临时存储单元,并将实参对应的值传递给形参,在被调用函数中对形参存储单元中的值进行运算,最后通过return语句把函数值返回调用函数。当调用结束后,形参单元被释放,实参单元仍保留并维持原值。(6)【答案】C)【解析】函数fun中采用了变量作为参数,那么参数传递以后,形参a,b,c的变化对于实参a,b,c是没有影响的,因此主函数中a,b,c的值经过fun调用以后,值没有变化。(7)【答案】B)【解析】在函数main()中,第一次执行for循环时,b的值等于1,此时输出字母B;第二次执行for循环时,b的值等于3,此时输出字母D;第三次执行for循环时,b的值等于8,此时输出字母I。(8)【答案】A)【解析】函数f的主要功能为逆置输出整数x的每一位数据,如果z的值为123456,逆置输出的结果为6-5-4-3-2-1。(9)【答案】D)【解析】函数fun的主要功能是:初值x的值为9,因此fun(9)=9-fun(7)=9-(7-(5-(3-3))),因此答案为7。(10)【答案】C)【解析】函数fun为递归定义的函数,当调用fun(5)5+fun(4)5+4+fun(3)5+4+3+fun(2)5+4+3+2+fun(1),因此最后的结果为15。(11)【答案】B)【解析】本题考查了函数的调用,函数fun功能为求两个数据的和。主函数中表达式r=fun(fun(x,y),z--),首先计算内层调用fun(x,y),计算结果为13,然后外层调用fun(13,8),结果为21。(12)【答案】A)【解析】C语言中形参数组是指针变量,其数组中元素的个数由传递的实参数组fun(x)=3x=0或者x=1;x=fun(x-2)其他。精品教育的倡导者饮水思源·感恩戴德做一个有责任心,有耐心,有爱心的老师使我们源恩教育每一位老师的追求。决定,因此可以在定义的时候,不给出元素个数的说明,因此选项B)和D)形参均为指针变量,选项A)的定义在C语言中不存在的。(13)【答案】C)【解析】这道题目考查了函数的递归调用,当执行调用语句n=fun(3)时,返回n=fun(2)+1,再执行fun(2),返回n=fun(1)+1+1,而fun(1)等于1,所以最后n的值等于3。而函数fun总共被调用了3次。即fun(3),fun(2),fun(1)。(14)【答案】B)【解析】在字符串中字符'\0'表示字符串的结束标志,所以字符串a和b相连接的结果为ABCDIJK。(15)【答案】D)【解析】在C语言中函数可以递归调用,即直接或间接地自己调用自己。本题在函数intfun(intn)的定义中又出现了对函数fun的调用,所以函数fun是递归函数。因而在主函数中调用x=fun(x)时,当输入10赋给变量x时,递归调用的过程为:fun(10)=10+fun(9)=10+9+fun(8)=10+9++8+fun(7)=10+9++8+7+fun(6)=10+9++8+7+6+fun(6)=10+9++8+7+6+5+fun(4)=10+9++8+7+6+5+4+fun(3)=10+9++8+7+6+5+4+3+fun(2)=10+9++8+7+6+5+4+3+2+fun(1)=10+9++8+7+6+5+4+3+2+1=55第6章指针6.1变量的地址和指针(1)【答案】B)【解析】函数指针的定义形式是:数据类型标识符(*指针变量名)();void(*pf)()定义了一个没有返回值的函数指针pf,在给函数指针变量赋值时,只需给出函数名而不必给出参数。所以给pf给赋值时,把函数名fun赋给pf即可。(2)【答案】C)【解析】定义语句int(*f)(int)中f是指向函数的指针变量,该函数中也只有一个int型的形参。(3)【答案】C)【解析】指针变量定义形式为:类型*指针变量名;其中*号的个数决定了几级指针,指针变量赋地址值的方式有3种方式:①通过求地址运算符(&)获得地址值②通过指针变量获得地址值③通过标准函数获得地址值另外NULL是在stdio.h头文件中定义的预定义符。NULL的代码值为0。可以给指针变量赋NULL值。例如p=NULL;赋值语句,称p为空指针。这条语句等价于p='\0';或p=0;这时,指针p并不是指向地址为0的存储单元,而是具有一个确定的值——“空”。(4)【答案】D)【解析】在对指针进行加、减算术运算时,数字1表示1个存储单元的长度,而double类型数据在内存中占8个字节,因此移动一次移动8个字节。其他三个都不正确。(5)【答案】A)【解析】函数func为返回值为指针的函数,有两个形参,形参数组a为指针变量,保存实参数组的首地址,其元素个数由实参数组决定,因此说明中的a[10]写成a[]或*a效果完全一样。6.2指针变量赋值及运算(1)【答案】B)【解析】定义指针变量时,必须将指针变量初始化为NULL(为空),否则,如果不赋给它地址,系统会随机给它分配一个地址。(2)【答案】D)【解析】指针变量的值只能是存储单元地址,而不能是一个整数,选项D)的描述是错误,为待选答案。函数可以返回内存空间的地址,同时函数形参和实参分别占用不同的内存单元,改变形参的值不会改变对应实参的值,在头文件stdio.h中,NULL被定义为void型的指针。(3)【答案】B)【解析】定义