函数指针与结构体练习题参考答案.docx
- 文档编号:27466419
- 上传时间:2023-07-01
- 格式:DOCX
- 页数:20
- 大小:20.72KB
函数指针与结构体练习题参考答案.docx
《函数指针与结构体练习题参考答案.docx》由会员分享,可在线阅读,更多相关《函数指针与结构体练习题参考答案.docx(20页珍藏版)》请在冰豆网上搜索。
函数指针与结构体练习题参考答案
函数
(一)选择题
1.以下正确的说法是_________.
建立函数的目的之一是a)提高程序的执行效率
b)提高程序的可读性
c)减少程序的篇幅
d)减少程序文件所占内存
2.以下正确的函数原型声明形式是________.
a)doublefun(intx,inty)
b)doublefun(intx;inty)
c)doublefun(intx,inty);
d)doublefun(intx,y);
3.C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式为______.
A)地址传递
B〕单向值传递
C〕由实参传给形参,再由形参传回给实参
D〕由用户指定传递方式
4.C语言允许函数值类型缺省定义,此时该函数值隐含的类型是______.
a)float
b)int
c)long
d)double
5.已有以下数组定义和f函数调用语句,那么在f函数的说明中,对形参数组array
的错误定义方式为________.
inta[3][4];
f(a);
a)f(intarray[][6])
b)f(intarray[3][])
c)f(intarray[][4])
d)f(intarray[2][5])
6.以下程序的正确运行结果是_________.
#include
voidnum()
{externintx,y;inta=15,b=10;
x=a-b;
y=a+b;
}
intx,y;
main()
{
inta=7,b=5;
x=a+b;
y=a-b;
num();
printf("%d,%d\n",x,y);
}
a)12,2b)不确定c)5,25d)1,12
7.以下正确的描述是____________.
a)C语言的预处理功能是指完成宏替换和包含文件的调用
b)预处理指令只能位于C源程序文件的首部
c)但凡C源程序中行首以"#"标识的控制行都是预处理指令
d)C语言的编译预处理就是对源程序进行初步的语法检查
8.在"文件包含"预处理语句的使用形式中,当#include后面的文件名用<>(尖括号)括起时,找寻被包含文件的方式是_______.
a)仅仅搜索当前目录
b)仅仅搜索源程序所在目录
c)直接按系统设定的标准方式搜索目录
d)先在源程序所在目录搜索,再按照系统设定的标准方式搜索
9. 当调用函数时,实参是一个数组名,那么向函数传送的是_____.
A.数组的长度B
10.函数的值通过return语句返回,下面关于return语句的形式描述错误的选项是_____.
A.return表达式;B.return(表达式);
C
11.设函数fun的定义形式为
voidfun(charch,floatx){…}
那么以下对函数fun的调用语句中,正确的选项是_____.
A.fun("abc",3.0);B.t=fun('D',16.5);C.fun('65',2.8);D.fun(32,32);
12.以下程序的输出结果是_____.
voidreverse(inta[],intn)
{inti,t;
for(i=0;i {t=a[i];a[i]=a[n-1-i];a[n-1-i]=t;} } main() {intb[10]={1,2,3,4,5,6,7,8,9,10};inti,s=0; reverse(b,8); for(i=6;i<10;i++)s+=b[i]; printf("%d\n",s); } A.22B.10 13.阅读以下程序,那么运行结果为_____. fun() {staticintx=5; x++; returnx; } main() {inti,x; for(i=0;i<3;i++) x=fun(); printf("%d\n",x); } A.5B.6C.7D.8 14.假设使用一维数组名作函数实参,那么以下正确的说法是_____. A.必须在主调函数中说明此数组的大小 C.在被调用函数中,不需要考虑形参数组的大小 15.在C语言中,定义函数时函数的类型可以缺省,此时函数的隐含类型是_____. A.voidB. 16.在C语言中,形参的缺省存储类别是(). A 17.以下关于字符串的表达中正确的选项是_____. D.空串一定比空格打头的字符串小 18.阅读程序,选择程序的运行结果。 #include intTry(intn) { if(n>0) return(n*Try(n-2)); else return1; } voidmain() { intx; x=Try(5); printf(“%d\n〞,x); } A.15B.120C.1D.前面三个答案都是错的 (二)填空题 1.以下程序的运行结果是maxis2. #include max(intx,inty) {intz; z=(x>y)? x: y; return(z); } main() {inta=1,b=2,c; c=max(a,b); printf("maxis%d\n",c); } 2.函数gongyu的作用是求整数num1和num2的最大公约数,并返回该值。 请填空。 gongyu(intnum1,intnum2) {inttemp,a,b; if(num1〔_____〕num2) {temp=num1;num1=num2;num2=temp;} a=num1;b=num2; while(____) {temp=a%b;a=b;b=temp;} return(a); } 3.以下程序的运行结果是A+B=9. inta=5;intb=7; main() {inta=4,b=5,c; c=plus(a,b); printf("A+B=%d\n",c); } plus(intx,inty) {intz; z=x+y; return(z); } 4.以下程序的运行结果是_______. main() {incx(); incy(); incx(); incy(); incx(); incy(); } incx() { intx=0; printf("x=%d\t",++x); } incy() {staticinty=0; printf("\ny=%d\n",++y); } 答案: x=1 y=1 x=1 y=2 x=1 y=3 5.以下程序功能是求两个正整数的最大公约数。 #include main() { intr,m,n,_____; scanf("%d%d",&m,&n); if(m ________________ r=m%n; while(r) {m=n; n=r; r=____; } printf("%d\n",n); } 指针 (一)选择题 1.假设有以下定义,那么对a数组元素的正确引用是_________. inta[5],*p=a; a)*&a[5]b)a+2c)*(p+5)d)*(a+2) 2.假设有定义: inta[2][3],那么对a数组的第i行j列元素地址的正确引用为______. a)*(a[i]+j)b)(a+i)c)*(a+j)d)a[i]+j 3.假设有以下定义,那么p+5表示_______. inta[10],*p=a; a)元素a[5]的地址b)元素a[5]的值 c)元素a[6]的地址d)元素a[6]的值 4.下面程序段的运行结果是_________. char*s="abcde"; s+=2;printf("%d",s); a)cdeb)字符'c'c)字符'c'的地址d)无确定的输出结果 5.设p1和p2是指向同一个字符串的指针变量,c为字符变量,那么以下不能正确 执行的赋值语句是________. a)c=*p1+*p2;b)p2=cc)p1=p2d)c=*p1*(*p2); 6.以下正确的程序段是_________. a)charstr[20];b)char*p; scanf("%s",&str);scanf("%s",p); c)charstr[20];d)charstr[20],*p=str; scanf("%s",&str[2]);scanf("%s",p[2]); 7.假设有说明语句 chara[]="Itismine"; char*p="Itismine"; 那么以下不正确的表达是________. a)a+1表示的是字符t的地址 b)p指向另外的字符串时,字符串的长度不受限制 c)p变量中存放的地址值可以改变 d)a中只能存放10个字符 8.下面程序的运行结果是_______. #include #include main() { char*s1="AbDeG"; char*s2="AbdEg"; s1+=2;s2+=2; printf("%d\n",strcmp(s1,s2)); } a)正数b)负数c)零d)不确定的值 9.下面程序的运行结果是_______. #include #include fun(char*w,intn) {chart,*s1,*s2; s1=w;s2=w+n-1; while(s1 } main() {charp[]="1234567";//这里存在错误,通过字符指针无法改变字符串常量的值,因此改为数组 fun(p,strlen(p)); puts(p); } a)7654321b)1714171c)1711717d)7177171 10.变量的指针,其含义是指该变量的_________. a)值b)地址 c)名d)一个标志 11.假设有语句int*point,a=4;和point=&a;下面均代表地址的一组选项是_____. a)a,point,*&ab)&*a,&a,*point c)*&point,*point,&ad)&a,&*point,point 12.假设有说明;int*p,m=5,n;以下正确的程序段的是________. a)p=&n;b)p=&n; scanf("%d",&p);scanf("%d",*p); c)scanf("%d",&n);d)p=&n; *p=n;*p=m; 13.假设有以下定义,那么对a数组元素的正确引用是_____. inta[5],*p=a; A.*&a[5]B.a+2C.*(p+2)D.*(a+5) 14.以下程序执行后的输出结果是_____. main() {inta[3][3],*p,i; p=&a[0][0]; for(i=1;i<9;i++)p[i]=i+1; printf("%d\n",a[1][2]); } A.3B.6 15.下面程序段的运行结果是_____.〔该题题目有错,而且考的内容偏了,是一题面试题〕 char*p="abcdefgh"; p+=3; printf("%d\n",strlen(strcpy(p,"ABCD"))); A.8B.12C (二)填空题 1.以下程序的功能是: 通过指针操作,找出三个整数中的最小值并输出。 请填空。 #include"stdlib.h" main() {int*a,*b,*c,num,x,y,z; a=&x;b=&y;c=&z; printf("输入3个整数: "); scanf("%d%d%d",a,b,c); printf("%d,%d,%d\n",*a,*b,*c); num=*a; if(*a>*b)num=*b; if(num>*c)num=*c; printf("输出最小整数: %d\n",num); } 2.下面程序段的运行结果是hELLO! . chars[80],*sp="HELLO! "; sp=strcpy(s,sp); s[0]='h'; puts(sp); 3.下面程序段的运行结果是ef. charstr[]="abc\0def\0ghi",*p=str; printf("%s",p+5); 4.下面程序的功能是将两个字符串s1和s2连接起来。 请填空。 #include main() {chars1[80],s2[80]; gets(s1);gets(s2); conj(s1,s2); puts(s1); } conj(char*p1,char*p2) {char*p=p1; while(*p1)p1++; while(*p2){*p1=*p2;p1++;p2++;} *p1='\0'; _return0_________;//可以省略不要 } 5.假设有定义: inta[]={2,4,6,8,10,12},*p=a;那么*(p+1)的值是__4____.*(a+5)的值是__12_______. 6.假设有以下定义: inta[2][3]={2,4,6,8,10,12};那么a[1][0]的值是__8___.*(*(a+1)+0))的值是___8___. 7.以下程序将数组a中的数据按逆序存放,请填空。 #defineM8 main() {inta[M],i,j,t; for(i=0;i i=0;j=M-1; while(i { t=*(a+i);*(a+i)=*(a+j);*(a+j)=t; i++;j--; } for(i=0;i } 8.假设有定义: inta[3][5],i,j;(且0<=i<3,0<=j<5),那么a数组中任一元素可用 五种形式引用。 它们是: (1)a[i][j] (2)*(a[i]+j) (3)*(*(a+i)+j); (4)(*(a+i))[j] (5)*(a+5*i+j) 9.下面程序的运行结果是_________. main() {char*a[]={"Pascal","Clanguage","dBase","Coble"}; char(**p)[]; intj; p=a+3; for(j=3;j>=0;j--)printf("%s\n",*(p--)); } 答案: Coble dBase Clanguage Pascal 结构体 (一)选择题 1.C语言结构体类型变量在程序执行期间_________. a)所有成员一直驻留在内存中 b)只有一个成员驻留在内存中 c)局部成员驻留在内存中 d)没有成员驻留在内存中 2.下面程序的运行结果是___________. main() { structcmplx{intx; inty; }cnum[2]={1,3,2,7}; printf("%d\n",cnum[0].y/cnum[0].x*cnum[1].x); } a)0b)1c)3d)6 3.设有如下定义: structsk {intn; floatx; }data,*p; 假设要使p指向data中的n域,正确的赋值语句是_______. a)p=&data.n; b)*p=data.n; c)p=(structsk*)&data.n; d)p=(structsk*)data.n; 4.以下对结构体变量stu1中成员age的非法引用是________. structstudent {intage; intnum; }stu1,*p; p=&stu1; a)stu1.ageb c)p->aged)(*p).age 5.下面对typedef的表达中不正确的选项是______. a)用typedef可以定义各种类型名,但不能用来定义变量 b)用typedef可以增加新类型 c)用typedef只是将已存在的类型用一个新的标识符来代表 d)使用typedef有利于程序的通用和移植 6.以下scanf函数调用语句中对结构体变量成员的不正确引用是________. structpupil {charname[20]; intage; intsex; }pup[5],*p; p=pup; a)scanf("%s",pup[0].name); b)scanf("%d",&pup[0].age); c)scanf("%d",&(p->sex)); d)scanf("%d",p->age); (二)填空题 1.以下程序的运行结果是__10,x______. structn{ intx; charc; }; main() {structna={10,'x'}; func(a); printf("%d,%c",a.x,a.c); } func(structnb) { b.x=20; b.c='y'; } 2.假设有定义: structnum {inta; intb; floatf; }n={1,3,5.0}; structnum*pn=&n; 那么表达式pn->b/n.a*++pn->b的值是___12_____,表达式(*pn).a+pn->f的值是 3.以下程序的运行结果是5,3. structks {inta; int*b; }s[4],*p; main() { intn=1,i; printf("\n"); for(i=0;i<4;i++) { s[i].a=n; s[i].b=&s[i].a; n=n+2; } p=&s[0]; p++; printf("%d,%d\n",(++p)->a,(p++)->a); } 4.结构数组中存有三人的姓名和年龄,以下程序输出三人中最年长者的姓名 和年龄。 请在_______内填入正确内容。 statistructman{ charname[20]; intage; }person[]={"li=ming",18, "wang-hua",19, "zhang-ping",20 }; main() {structman*p,*q; intold=0 p=person; for(;p if(old {q=p;old=p->age;} printf("%s%d",q->name,q->age); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 指针 结构 练习题 参考答案