第九章?数组
一、选择题
?[9.1]??若已定义:
int?a[]={0,1,2,3,4,5,6,7,8,9},*p=a,i;
其中0<=i<=9,则对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+i???D) &a[++i]
main()
{?int?a[10],i=0;
while(i<10)?scanf("%d",_);
}
【解析】因为要遍历,所以排除B.C,因为D先加1再取值,丢了a[0]
?[9.3]??以下程序的输出结果是
??A) 3???????B)?4?????????C) 1?????D) 2
main()
{?int??a[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)?3????C) 2?????D) 1
main()
{?int?n[2]={0},i,j,k=2;
for(i=0;i
for(j=0;j
n[j]=n[i]+1;
printf("%d\n",n[k]);
}
?[9.5]??以下程序的输出结果是
???A)17?????B)18?????C)19?????D)20
main()
{ int a[]={2,4,6,8,10},y=1,x,*p;
p=&a[1];
for(x=0;x<3;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) 6??????B) 8??????C) 4??????D) 2
main()
{ int a[]={2,4,6,8},*p=a,i;
for(i=0;i<4;i++) a[i]=*p++;
printf("%d\n",a[2]);
}
【解析】p=a,相当于重新把a中的内容赋给a本身,所以a[2]=6
?[9.7]??以下程序的输出结果是
A) 720?????B)?120?????C) 24?????D) 6
f(int?b[],int?n)
{??int?i,r=1;
for(i=0;i<=n;i++) r=r*b[i];
return r;
}
main()
{??int?x,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) 212?????B)?204??????C)?1a4??????D)?1a6??????12
main()
{??int?a[]={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) 0987654321??B)?4321098765??C) 5678901234??D) 0987651234
fun(int?*s,int?n1,int n2)
{?int?i,j,t;
??i=n1; j=n2;
while(i
{ t=*(s+i); *(s+i)=*(s+j); *(s+j)=t;
??i++; j--; }
}
main()
{?int?a[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;i<10;i++)??printf("%d",*(a+i));
}
【解析】为了