第九章数组一、选择题[9.1]若已定义:inta[]={0,1,2,3,4,5,6,7,8,9},*p=a,i;其中0<=i=9,则对a数组元素的引用不正确的是A)a[p-a]B)*(&a[i])C)p[i]D)*(*(a+i))【解析】A:p开始是数组a首地址,只要p++则再减去a的首地址a[p-a]就能取到所有元素,B:&a[i]循环取其地址,*(&a[i])是该地址中所存储的元素C:p就是指针变量,相当于a[i],D:*(a+i)则正确[9.2]以下程序段数组所有元素输入数据,应在下划线填入的是A)a+(i++)B)&a[i+1]C)a+iD)&a[++i]main(){inta[10],i=0;while(i10)scanf(%d,_);}【解析】因为要遍历,所以排除B.C,因为D先加1再取值,丢了a[0][9.3]以下程序的输出结果是A)3B)4C)1D)2main(){inta[10]={1,2,3,4,5,6,7,8,9,10},*p=a;printf(%d\n,*(p+2));}【解析】*p=a;p指向首地址,*(p+2))往后移动两个元素,指向3[9.4]以下程序的输出结果是A)不确定的值B)3C)2D)1main(){intn[2]={0},i,j,k=2;for(i=0;ik;i++)for(j=0;jk;j++)n[j]=n[i]+1;printf(%d\n,n[k]);}[9.5]以下程序的输出结果是A)17B)18C)19D)20main(){inta[]={2,4,6,8,10},y=1,x,*p;p=&a[1];for(x=0;x3;x++)y+=*(p+x);printf(%d\n,y);}【解析】p=&a[1]则p指向元素为4,y+=*(p+x);相当于y=1+4+6+8=19[9.6]以下程序的输出结果是A)6B)8C)4D)2main(){inta[]={2,4,6,8},*p=a,i;for(i=0;i4;i++)a[i]=*p++;printf(%d\n,a[2]);}【解析】p=a,相当于重新把a中的内容赋给a本身,所以a[2]=6[9.7]以下程序的输出结果是A)720B)120C)24D)6f(intb[],intn){inti,r=1;for(i=0;i=n;i++)r=r*b[i];returnr;}main(){intx,a[]={2,3,4,5,6,7,8,9};x=f(a,3);printf(%d\n,x);}【解析】调用x=f(a,3);for循环4次,将前四个元素相乘,即得r=2*3*4*5;[9.8]以下程序中若第一个printf语句输出的是194,则第二个printf语句的输出结果是A)212B)204C)1a4D)1a612main(){inta[]={1,2,3,4,5,6,7,8,9,0},*p;p=a;printf(%x\n,p);printf(%x\n,p+9);}【解析】因为开始p的地址为194,p+9是指指针向后移动9个元素,而不是9个字节,每个int占2个字节,所以共移动18个字节,1个字节占一个存储单位,%x\n是16进制,将18转化成16进制是12,所以194+12=2a6[9.9]以下程序的输出结果是A)0987654321B)4321098765C)5678901234D)0987651234fun(int*s,intn1,intn2){inti,j,t;i=n1;j=n2;while(ij){t=*(s+i);*(s+i)=*(s+j);*(s+j)=t;i++;j--;}}main(){inta[10]={1,2,3,4,5,6,7,8,9,0},i,*p=a;fun(p,0,3);fun(p,4,9);fun(p,0,9);for(i=0;i10;i++)printf(%d,*(a+i));}【解析】为了使大家清晰地看出fun(int*s,intn1,intn2)的作用,我自己完善了程序如下:#includestdio.h#includestdlib.hfun(int*s,intn1,intn2){inti,j,t;i=n1;j=n2;while(ij){t=*(s+i);*(s+i)=*(s+j);*(s+j)=t;i++;j--;}}main(){inta[10]={1,2,3,4,5,6,7,8,9,0},i,*p=a;fun(p,0,3);for(i=0;i10;i++)printf(%d,*(a+i));printf(\n);fun(p,4,9);for(i=0;i10;i++)printf(%d,*(a+i));printf(\n);fun(p,0,9);for(i=0;i10;i++)printf(%d,*(a+i));printf(\n);}结果如下:其实,fun(p,0,3);就是将a中的前4个元素倒序,fun(p,4,9);就是将a中的第5个到第10个倒序,最后fun(p,0,9);全部元素倒序。[9.10]以下程序的输出结果是A)44B)22C)24D)46main(){inta[5]={2,4,6,8,10},*p,**k;p=a;k=&p;printf(%d,*(p++));printf(%d\n,**k);}【解析】p指向a的第一个元素,printf(%d,*(p++));先输出第一个元素为2,然后p++,所以p的地址就为指向4,k=&p;k是存放p的地址的,*k=p,**k就是p所指的元素为4,所以结果为24[9.11]当运行以下程序时输入三行,每行都是在第一列上开始,<CR>代表Enter键;aCRbCRcdefCR则程序的输出结果是A)abcdefB)aC)aD)abbbccdcdefdf#includestdio.h#defineN6main(){charc[N];inti=0;for(i=0;iN;i++)c[i]=getchar();for(i=0;iN;i++)putchar(c[i]);}【解析】回车键也是字符,所以aCRbCRcd这六个字符输出[9.12]若有定义和语句:intc[4][5],(*cp)[5];cp=c;则对C数组元素的引用正确的是A)cp+1B)*(cp+3)C)*(cp+1)+3D)*(*cp+2)【解析】cp是行指针,只表示行,若要表示元素,则需要配合列A:表示第二行B:表示第四行的内容,但是为指出那一列C:*(cp+1)+3只是地址不是元素值,需改为*(*(cp+1)+3)[9.13]若已定义:inta[4][3]={1,2,3,4,5,6,7,8,9,10,11,12},(*prt)[3]=a,*p=a[0];则能够正确表示数组元素a[1][2]的表达式是A)*((*prt+1)[2])B)*(*(p+5))C)(*prt+1)+2D)*(*(a+1)+2)【解析】A:多了外层的*(),B:p是行地址,加5越界。C:少了外层的*()[9.14]若有定义和语句:inta[4][3]={1,2,3,4,5,6,7,8,9,10,11,12},(*prt)[3]=a,*p[4],i;for(i=0;i4;i++)p[i]=a[i];则下能够正确表示a数组元素的表达式是A)a[4][3]B)p[0][0]C)prt[2][2]D)(*(p+1))[1][9.15]以下程序的输出结果是A)23B)26C)33D)36main(){intaa[3][3]={{2},{4},{6}},i,*p=&aa[0][0];for(i=0;i2;i++){if(i==0)aa[i][i+1]=*p+1;else++p;printf(%d,*p);}printf(\n);}【解析】p指向第一个元素2,if(i==0)aa[i][i+1]=*p+1;给aa[0][1]赋值2+1=3打印出p的内容为2,第二次for循环++p,使p指向下一个元素即aa[0][1]=3,输出其内容为3[9.16]以下程序的输出结果是A)60B)68C)99D)108main(){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};int(*p)[4]=a,i,j,k=0;for(i=0;i3;i++)for(j=0;j2;j++)k+=*(*(p+i)+j);printf(%d\n,k);}【解析】k+=*(*(p+i)+j);即求和:a[0][0]+a[0][1]+a[1][0]+a[1][1]+a[2][0]+a[2][1]=1+3+11+13+17+19=60[9.17]以下程序的输出结果是A)1,5,9,B)1,4,7,C)3,5,7,D)3,6,9,main(){inti,x[3][3]={1,2,3,4,5,6,7,8,9};for(i=0;i3;i++)printf(%d,,x[i][2-i]);}【解析】即输出x[0][2]x[1][1]x[2][0]分别为357[9.18]若有定义语句int(*p)[M];其中的标识符是A)M个指向整型变量的指针B)指向M个整型变量的函数指针C)一个指向具有M个整型元素的一维数组指针D)具有M个指针元素的一维指针数组,每个元素都只能指向整型量二、填空题[9.19]若有以下定义:doublew[10];则数组元素下标的上限是9,下限是0。[9.20]以下程序的输出结果是6。main(){inta[]={2,4,6},*ptr=&a[0],x=8,y,z;for(y=0;y3;y++)z=(*(ptr+y)x)?*(ptr+y):x;printf(%d\n,z);}【解析】因为a[]中元素永远小于x=8,所以每次For循环都执行z=(*(ptr+y),循环3次最后输出的z为6(前几次的z都被覆盖了)[9.21]以下程序的输出结果是12。main(){intarr[10],i,k=0;for(i=0;i10;i++)arr[i]=i;for(i=0;i4;i++)k+=arr[i]+i;printf(%d\n,k);}【解析】首先arr[i]=i;使得arr[]中赋值0-9十个数,for循环4次,k+=arr[i]+i;得k=0+0+1+1+2+2+3+3=12[9.22]以下程序的输出结果是3.#defineN5fun(char*s,chara,intn){intj;*s=a;j=n;while(as[j])j--;returnj;}main(){chars[N+1];intk,p;for(k=1;k=N;k++)s[k]='A'+k+1;printf(%d\n,fun(s,'E',N));}[9.23]若输入3个整数3、2、1,则以下程序的输出结果是2721。#includestdio.h#includestdlib.hvoidsub(intn,intuu[]){intt;t=uu[n--];t+=3*uu[n];n++;if(t=10){uu[n++]=t/10;uu[n]=t%10;}elseuu[n]=t;}main(){inti,n,aa[10]={0};scanf(%d%d%d,&n,&aa[0],&aa[1]);for(i=1;in;i++)sub(i,aa);for(i=0;i=n;i++)printf(%d,aa[i]);printf(\n);}[9.24]以下程序的输出结果是-850,2,0.main(){inti,j,row,col,m;intarr[3][3]={{100,200,300},{28,72,-30},{-850,2,6}};m=arr[0][0];for(i=0;i3;i++)for(j=0;j3;j++)if(arr[i][j]m){m=arr[i][j];row=i;col=j;}printf(%d,%d,%d\n,m,row,col);}【解析】本题是为找出数组中的最