您好,欢迎访问三七文档
当前位置:首页 > 财经/贸易 > 资产评估/会计 > 23790第6章-指针习题答案
习题解答一、单项选择题1.若定义了intn=2,*p=&n,*q=p;则下面【】的赋值是非法的。A.p=qB.*p=*qC.n=*qD.p=n【答案】D2.若定义了double*p,a;则能通过scanf函数给输入项读入数据的程序段是【】。A.p=&a;scanf(“%1e”,p);B.*p=&a;scanf(“%1f”,p);C.p=&a;scanf(“%f”,p);D.p=&a;scanf(“%1f”,a);【答案】C3.若定义了inta[10],i=3,*p;p=&a[5];下面不能表示为a数组元素的是【】。A.p[-5]B.a[i+5]C.*p++D.a[i-5]【答案】D4.若有如下定义:intn[5]={1,2,3,4,5},*p=n;则值为5的表达式是【】。A.*+5B.*(p+5)C.*p+=4D.p+4【答案】C5.设变量b的地址已赋给指针变量ps,下面为“真”的表达式是【】。A.b==&psB.b==psC.b==*psD.&b==&ps【答案】C6.设有以下定义和语句:inta[3][2]={1,2,3,4,5,6},*p[3];p[0]=a[1];则*(p[0]+1)所代表的数组元素是【】。A.a[0][1]B.a[1][0]C.a[1][1]D.a[1][2]【答案】C7.若定义了char*str=”Hello!”;下面程序段中正确的是【】。A.charc[],*p=c;strcpy(p,str);B.charc[5],*p;strcpy(p=&c[1],&str[3]);C.charc[5];strcpy(c,str);D.charc[5];strcpy(p=c+2,str+3);【答案】B8.若有下面的程序段,则不正确的fxy函数的首部是【】。main(){inta[20],n;…fxy(n,&a[10]);…}A.voidfxy(inti,intj)B.voidfxy(intx,int*y)C.voidfxy(intm,intn[])D.voidfxy(intp,intq[10])【答案】A9.不合法的带参数main函数的首部形式是【】。A.main(intargc,char*argv)B.main(inti,char**j)C.main(inta,char*b[])D.main(intargc,char*argv[10])【答案】A10.设有如下定义int(*pt)();则以下叙述中正确的是【】。A.pt是指向一维数组的指针变量B.pt是指向整型数据的指针变量C.pt是一个函数名,该函数的返回值是指向整型数据的指针D.pt是指向函数的指针变量,该函数的返回值是整型数据【答案】D二、填空题1.请指出在int*p[3];定义中p是【1】。在int(*q)();定义中q是【2】。【答案】【1】整型指针数组;【2】指向返回值是整型的函数指针2.若有如下定义,则使指针p指向值为20的数组元素的表达式是p+=。inta[6]={1,5,10,15,20,25},*p=a;【答案】43.执行以下程序段后,x的值为。inta[3][2]={{1,2},{10,20},{15,30}};intx,*p;p=&a[0][0];x=(*p)*(*(p+3))*(*(p+5));【答案】6004.请填空将函数补充完整,使得add函数具有求两个数之和的功能。voidadd(inta,intb,【1】c){【2】=a+b;}【答案】【1】int*;【2】*c5.下面程序的功能是输出数组中的最大值,由s指针指向该元素,请将该程序补充完整。main(){inta[8]={6,7,2,9,1,10,5,8},*p,*s;for(p=a,s=a;p-a8;p++)if()s=p;printf(“max:%d\n”,*s);}【答案】*p*s6.下面程序的功能是通过调用aver函数,计算数组中各元素的平均值。请将该程序补充完整。floataver(int*a,intn){inti;floatx=0.0;for(i=0;in;i++)x+=【1】;x=【2】;returnx;}main(){intm[]={2,1,7,4,5,9,6};floatavg;avg=aver(m,7);printf(“average=%f\n”,avg);}【答案】【1】a[i]或*(a+i);【2】x/n7.下面函数的功能是计算指针p所指向的字符串中的字符个数。请将该程序补充完整。unsignedintMStrlen(char*p){unsignedintlen;len=0;for(;*p!=【1】;p++){len【2】;}return【3】;}【答案】【1】’\0’;【2】++;【3】lenunsignedintMStrlen(chars[]){char*p=s;while(*p!=【1】){p++;}return【2】;}【答案】【1】’\0’;【2】p-s8.下面函数的功能是对两个字符串进行比较,返回两个字符串中第一个不同字符的ASCII值之差。例如,字符串“abcd”和“abm”,输出-10。请将该程序补充完整。intcmp(char*p,char*q){while(*p==*q&&*p!=【1】){p++;q++;}return(【2】);}【答案】【1】’\0’;【2】*p-*q9.下面程序的功能是输出命令行的参数,若程序生成的可执行文件为file.exe,则执行该程序时键入命令:fileNEWBEIJING程序输出结果为:NEWBEIJING请将该程序补充完整。main(intargc,char**argv){while(--argc【1】){argv++;printf(“%s”,【2】);}}【答案】【1】0;【2】*argv三、阅读程序,写结果1.#includestdio.hvoidfact(intm,intn,int*p1,int*p2){*p1=2*m+n;*p2=m-n/2;}main(){inta,b,c,d;a=4;b=7;fact(a,b,&c,&d);printf(“%d%d\n”,c,d);}【答案】1512.#includestdio.hmain(){charstr[]=”abcxyz”,*p;for(p=str;*p;p+=2)printf(“%s”,p);printf(“\n”);}【答案】abcxyzcxyxyz3.#includestdio.hmain(){staticintx[]={1,2,3};ints,i,*p=NULL;s=1;p=x;for(i=0;i3;i++){s*=*(p+i);}printf(“%d\n”,s);}【答案】64.#includestdio.hmain(){inta[]={1,2,3,4,5};int*p=NULL;p=a;printf(“%d,”,*p);printf(“%d,”,*(++p));printf(“%d,”,*++p);printf(“%d,”,*(p--));printf(“%d,”,*p++);printf(“%d,”,*p);printf(“%d,”,++(*p));printf(“%d,”,*p);}【答案】1,2,3,3,2,3,4,4,5.#includestdio.hcharb[]=”program”;char*a=”PROGRAM”;main(){inti=0;printf(“%c%s\n”,*a,b+1);while(putchar(*(a+i))){i++;}printf(“i=%d\n”,i);while(--i){putchar(*(b+i));}printf(“\n%s\n”,&b[3]);}【答案】ProgramPROGRAMi=7margorgram四、编程题1.编写函数,对传送过来的三个数选出最大和最小值,并通过形参传回调用函数。【参考程序】#includestdio.hvoidfind_maxmin(inta,intb,intc,int*max,int*min){*max=*min=a;if(*maxb)*max=b;if(*minb)*min=b;if(*maxc)*max=c;if(*minc)*min=c;return;}voidmain(){inta,b,c;intmax,min;printf(Pleaseinput3numbers:);scanf(%d%d%d,&a,&b,&c);find_maxmin(a,b,c,&max,&min);printf(\nthemaxis%d,theminis%d\n,max,min);}2.求一个3×3二维数组主对角线元素之和。【参考程序】#includestdio.hvoidmain(){inta[3][3],i,j;intsum;//输入3×3二维数组printf(Pleaseinput3*3numbers:);for(i=0;i3;i++)for(j=0;j3;j++)scanf(%d,&a[i][j]);sum=0;//求主对角线元素之和for(i=0;i3;i++)sum+=a[i][i];printf(\nthemaindiagonalsumis%d\n,sum);}3.有n个整数,使前面各数顺序向后移动m个位置,最后m个数变成最前面m个数,见图?。写一函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数。【参考程序】#includestdio.h#defineN5voidmove_num(int*a,intm){inti,b[N];//将a数组复制到b数组for(i=0;iN;i++)b[i]=a[i];//将b数组的元素移动m位复制到a数组for(i=0;iN;i++)n-mm图6-22题3示意a[(i+m)%N]=b[i];}voidmain(){inta[N],m,i;printf(Pleaseinput%dnumbers:,N);for(i=0;iN;i++)scanf(%d,&a[i]);printf(\nPleaseinputmovenumber:);scanf(%d,&m);move_num(a,m);printf(\naftermove:);for(i=0;iN;i++)printf(%d,a[i]);}4.用指针参数编写一个字符串连接的函数radd(char*s,char*t,intf),其中f为标志变量,当f=0时,将s指向的字符串连接到t指向的字符串的后面;当f=1时,将t指向的字符串连接到s指向的字符串的后面。并写出调用该函数的完整程序。【参考程序】#includestdio.h#includestring.hvoidradd(char*s,char*t,intf){char*tmp;inti=0;if(f==0)//标志变量为0,交换s和t的指向{tmp=t;t=s;s=tmp;}while(*s!='\0')s++;//将s移动到字符串末尾while(*(t+i)!='\0')//将t字符串复制到s中{*(s+i)=*(t+i);i++;}*(s+i)=0;//加上字符串结束标志}voidmain(){chars[40],t[40];intf;printf(Pleaseinput2strings:);gets(s);gets(t);printf(Pleaseselectstringadddirection:);scanf(%d,&f);radd(s,t,f);printf(\nafterstringadd:);puts(s);puts(t);}5.编写程序,利用指向函数的指针实现求1到n的和与阶乘。【参考程序】#includestdio.hlongn_sum(intn)//求1到n的和{longs=0;inti=0;for(i=1;i=n;i++)s=s+i;returns;}longn_factorial(intn)//求1到n的阶乘
本文标题:23790第6章-指针习题答案
链接地址:https://www.777doc.com/doc-4780035 .html