C函数易错试题与答案剖析_第1页
C函数易错试题与答案剖析_第2页
C函数易错试题与答案剖析_第3页
C函数易错试题与答案剖析_第4页
C函数易错试题与答案剖析_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

C函数易错试题与答案剖析考试时间:______分钟总分:______分姓名:______一、选择题(每题2分,共30分)1.以下哪个选项是合法的C函数声明?A.`voidprocess(inta,floatb);`B.`intfunc(char*c){return*c;}`C.`floatget_value();`D.`voidprint(int*p){}voidprint(charch){}`2.有以下代码:```cintfunc(intx,inty){returnx*y;}intmain(){inta=5;intb=func(2,3);intc=func(a,b);returnc;}```执行`main`函数时,变量`c`的值是多少?A.10B.20C.30D.编译错误3.关于以下代码的说法,正确的是?```c#include<stdio.h>intx=10;//全局变量voidmodify_x(){x=20;}intmain(){modify_x();printf("%d\n",x);return0;}```A.程序输出10。B.程序输出20。C.程序会产生编译错误,因为全局变量在main中不可见。D.程序会产生运行时错误。4.有以下函数定义:```cintsum(intarr[],intsize){inttotal=0;for(inti=0;i<size;i++){total+=arr[i];}returntotal;}```调用`sum((int[5]){1,2,3,4,5},5);`的结果是?A.5B.10C.15D.205.以下关于函数参数传递的说法,错误的是?A.值传递时,调用者变量和被调用者参数是不同的副本。B.地址传递时,调用者变量和被调用者参数指向同一内存地址。C.传递数组到函数时,总是按值传递整个数组。D.`voidfunc(int*p);`和`voidfunc(intarr[10]);`是等价的声明。6.有以下代码:```cvoidswap(inta,intb){inttemp=a;a=b;b=temp;}intmain(){intx=5,y=10;swap(x,y);printf("x=%d,y=%d\n",x,y);return0;}```程序输出是什么?A.x=5,y=10B.x=10,y=5C.x=0,y=0D.编译错误7.有以下代码:```c#include<stdio.h>intfunc(intn){if(n<=1)return1;returnn*func(n-1);}intmain(){intresult=func(3);printf("%d\n",result);return0;}```程序输出是什么?A.3B.6C.9D.18.以下哪个选项是合法的C函数定义?A.`intadd(int,int);//声明`(这里写定义)B.`voidprint(){printf("Hello");}`C.`int*get_int(){return0;}`//返回局部变量地址D.`intfunc()int{return5;}`9.有以下代码:```c#include<stdio.h>voidprint_val(intn){if(n<=0)return;print_val(n-1);printf("%d",n);}intmain(){print_val(3);return0;}```程序输出是什么?A.321B.123C.213D.3110.有以下代码:```c#include<stdio.h>intcount=0;voidfunc(){staticintlocal_count=0;local_count++;count++;printf("%d%d",local_count,count);}intmain(){func();//输出?func();//输出?return0;}```程序输出是什么?A.1121B.1112C.1021D.101211.有以下代码:```c#include<stdio.h>intadd(inta,intb){returna+b;}intmain(){intresult=add(1,2);returnresult;}````main`函数返回的是什么值?A.1B.2C.3D.012.有以下代码:```c#include<stdio.h>intvalue=10;voidchange_value(){value=20;}intmain(){change_value();printf("%d\n",value);return0;}```程序输出是什么?A.10B.20C.编译错误D.运行错误13.以下哪个选项描述了递归函数的关键特征?A.必须使用大量的循环。B.函数调用自身。C.没有返回值。D.参数必须是指针类型。14.有以下代码:```c#include<stdio.h>voidpass_by_value(intn){n+=10;printf("Insidepass_by_value:%d\n",n);}intmain(){intx=5;pass_by_value(x);printf("Inmain:%d\n",x);return0;}```程序输出是什么?A.Insidepass_by_value:15Inmain:15B.Insidepass_by_value:15Inmain:5C.Insidepass_by_value:5Inmain:15D.编译错误15.有以下代码:```c#include<stdio.h>voidfunc(int*ptr){*ptr=100;}intmain(){intvar=0;func(&var);printf("%d\n",var);return0;}```程序输出是什么?A.0B.100C.1D.编译错误二、填空题(每空2分,共20分)1.函数声明的作用是__________________________。2.当函数的返回类型为`void`时,表示该函数__________________________。3.传递数组到函数时,函数参数通常被视为指向数组首元素的__________________________。4.如果函数的参数是基本数据类型的地址(指针),则这种参数传递方式称为__________________________。5.递归函数必须有__________________________,否则会导致无限递归。6.在函数内部定义的变量,其作用域通常限制在该函数的__________________________内。7.使用`static`关键字声明的局部变量,其生命周期是__________________________(相对于函数调用)。8.在C语言中,函数可以嵌套调用,也可以__________________________。9.以下代码的输出结果是________。```c#include<stdio.h>intmultiply(inta,intb){returna*b;}intmain(){intx=multiply(3,multiply(4,5));printf("%d\n",x);}```10.以下代码的输出结果是________。```c#include<stdio.h>voidshow(intn){if(n>0){printf("%d",n);show(n-1);}}intmain(){show(4);}```三、简答题(每题10分,共30分)1.请解释“值传递”和“地址传递”在函数参数传递中的区别,并各举一个能体现其特点的代码示例(不需要完整程序,只需函数片段和说明)。2.在C语言中,为什么不能直接返回局部数组的地址?如果需要让函数返回一个数组,通常有哪几种可行的方法?3.什么是递归函数?请描述递归函数必须满足的两个基本条件,并给出一个使用递归计算阶乘的函数定义示例。试卷答案一、选择题1.C2.B3.B4.D5.C6.A7.B8.B9.A10.A11.C12.B13.B14.B15.B二、填空题1.告知编译器函数的名称、返回类型和参数列表(接口)2.不返回值3.指针4.地址传递(或传引用)5.终止条件(或基本情况)6.代码块(或函数体)7.局部静态(或函数内部)8.递归调用(或自身)9.8010.4321三、简答题1.解析思路:区分传递的是值的副本还是地址本身。*值传递:将参数值的副本传入函数。函数内部对副本的修改不会影响调用者原变量。适用于基本数据类型。*地址传递:将参数的内存地址(指针)传入函数。函数内部通过地址访问和修改调用者原变量。适用于需要修改调用者变量或传递大型数据结构(如数组)时。*示例:*值传递:```cvoidmodify(intn){n=n+1;}//修改的是n的副本intx=5;modify(x);printf("%d\n",x);//输出5,x未改变```*地址传递:```cvoidmodify(int*p){*p=*p+1;}//修改的是*p,即通过地址访问的变量intx=5;modify(&x);printf("%d\n",x);//输出6,x被修改```2.解析思路:理解局部变量的生命周期和作用域。*原因:函数内部的局部变量在函数调用结束后其占用的内存通常会释放(由系统回收)。如果函数返回一个指向该局部变量的指针,调用者将获得一个指向已释放内存的无效指针,访问它会导致未定义行为(通常是崩溃)。*方法:*返回指针/引用(指向动态分配的内存):函数内部使用`malloc`或类似函数分配内存,返回指向该内存的指针。调用者负责在使用完后释放这块内存(使用`free`)。```cint*create_array(intsize){int*arr=(int*)malloc(size*sizeof(int));//...初始化arr...returnarr;}```*修改调用者的指针参数:函数接收一个指向数组的指针作为参数,直接在函数内部修改这个指针,使其指向一个新创建的数组(同样需要调用者负责释放)。```cvoidcreate_array(intptr,intsize){*ptr=(int*)malloc(size*sizeof(int));//...初始化*ptr...}```*使用静态局部变量(不推荐用于返回数组本身,但可返回其地址):如果函数返回的是固定大小且在程序结束时仍需存在的数据(如查找结果),可以使用静态局部变量。但这不适用于返回动态创建的“数组”。```cint*get_pivot(){staticintar

温馨提示

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

评论

0/150

提交评论