for(i=0;i<10;i++)printf(“%d”,a[i]);使用了直接输出数组元素的方法。
17.答案选择:
D
分析:
D答案中输出列表中的表达式为(*p)++,首先p指向了数组a的首地址,那么*p的值就是a[0]为2,(*p)++的就是a[0]++得到的值为3。
for(i=0;i<6;i++)printf(“%2d”,(*p)++);输出的结果为:
333333
18.答案选择:
A
分析:
inta[]={1,2,3,4,5,6,7,8,9,10,11,12},*p=a+5,*q=NULL;指针q指向了NULL,指向了空,称q为空指针。
*q=*(p+5)表示q将访问a[10]的地址,这样将得到一个错误的信息。
记住:
如果通过一个空指针去访问一个存储单元时,将会得到一个错误的信息。
19.答案选择:
D
分析:
指针只能指向地址,不能将普通变量或是值赋值给指针。
A答案中p=100,将一个常量值赋值给指针是错误的
B答案中p=a[5],a[5]是数组中下标为5的数组元素,是一个值不是地址。
因此是错误的。
C答案p=a[2]+2,和B答案一样a[2]+2得到的也是一个值,不是地址。
D答案p=a+2,a表示数组的首地址,a+2表示地址的相加,得到的也是一个地址,就是a[2]的地址。
20.答案选择:
D
分析:
inta[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],b;b=p[5];
首先指针p指向了a[3]的地址,那么p[5]就应该是a[8],b=p[5]就是b=a[8],p的值就为9。
21.答案选择:
B
分析:
intx[8]={8,7,6,5,0,0},*s;s=x+3;
首先s指针指向了x[3]的地址,那么s[2]就是x[5],结果就该为:
0
22.答案选择:
C
分析:
inti,s=0,t[]={1,2,3,4,5,6,7,8,9}
(1)i=0,i<9成立,执行:
s+=*(t+0),s的值为1,执行i+=2
(2)i=2,i<9成立,执行:
s+=*(t+2),s的值为4,执行i+=2
(3)i=4,i<9成立,执行:
s+=*(t+4),s的值为9,执行i+=2
(4)i=6,i<9成立,执行:
s+=*(t+6),s的值为16,执行i+=2
(5)i=8,i<9成立,执行:
s+=*(t+8),s的值为25,执行i+=2
(6)i=9,i<9不成立,结束循环。
(7)输出的结果为:
25
23.答案选择:
B
分析:
inta[3][3],*p,i;p=&a[0][0];注意:
指针p是一维指针却指向了二维数组,这样的情况是允许的,二维数组在逻辑上是连续存储的。
(1)i=0,i<9成立,p[0]=0+1,即a[0][0]=1,执行i++
(2)i=1,i<9成立,p[1]=1+1,即a[0][1]=2,执行i++
(3)i=2,i<9成立,p[2]=2+1,即a[0][2]=3,执行i++
(4)i=3,i<9成立,p[3]=3+1,即a[1][0]=4,执行i++
(5)i=4,i<9成立,p[4]=4+1,即a[1][1]=5,执行i++
(6)i=5,i<9成立,p[5]=5+1,即a[1][2]=6,执行i++
(7)i=6,i<9成立,p[6]=6+1,即a[2][0]=7,执行i++
(8)i=7,i<9成立,p[7]=7+1,即a[2][1]=8,执行i++
(9)i=8,i<9成立,p[8]=8+1,即a[2][2]=9,执行i++
(10)i=9,i<9不成立,结束循环
(11)输出a[1][2]的值为6
24.答案选择:
D
分析:
inta[3][3],*p,i;p=&a[0][0];
第一个循环:
(1)i=0,i<9成立,p[0]=0,即a[0][0]=0,执行i++
(2)i=1,i<9成立,p[1]=1,即a[0][1]=1,执行i++
(3)i=2,i<9成立,p[2]=2,即a[0][2]=2,执行i++
(4)i=3,i<9成立,p[3]=3,即a[1][0]=3,执行i++
(5)i=4,i<9成立,p[4]=4,即a[1][1]=4,执行i++
(6)i=5,i<9成立,p[5]=5,即a[1][2]=5,执行i++
(7)i=6,i<9成立,p[6]=6,即a[2][0]=6,执行i++
(8)i=7,i<9成立,p[7]=7,即a[2][1]=7,执行i++
(9)i=8,i<9成立,p[8]=8,即a[2][2]=8,执行i++
(10)i=9,i<9不成立,结束循环
第二个循环:
(1)i=0,i<3为真,输出a[1][0]为3,执行i++
(2)i=1,i<3为真,输出a[1][1]为4,执行i++
(3)i=2,i<3为真,输出a[1][2]为5,执行i++
(4)i=3,i<3为假
(5)输出的结果为:
345
25.答案选择:
B
分析:
inta[3][2]={0},(*ptr)[2],i,j;
执行第一个循环:
for(i=0;i<2;i++)
{ptr=a+i;
scanf(“%d”,*ptr);
ptr++;
}
在运行时输入:
123<回车>
(1)i=0,i<2成立,执行循环体:
ptr=a+0,scanf(“%d”,*ptr);后a[0][0]的值为1,ptr++后ptr指向下一行的首地址。
(2)i=1,i<2成立,执行循环体:
ptr=a+1,scanf(“%d”,*ptr);后a[1][0]的值为2,ptr++后ptr指向下一行的首地址。
(3)i=2,i<2不成立,那么将结束循环,数值3将不能被输入。
执行第二个循环:
for(i=0;i<2;i++)
{for(j=0;j<2;j++)
printf(“%2d”,a[i][j]);
printf(“\n”);
}
(1)i=0,i<3成立
1)j=0,j<2成立,输出a[0][0]为1,执行j++
2)j=1,j<2成立,输出a[0][1]为0,执行j++
3)j=2,j<2不成立
4)输出换行,执行i++
(2)i=1,i<3成立
1)j=0,j<2成立,输出a[1][0]为2,执行j++
2)j=1,j<2成立,输出a[1][1]为0,执行j++
3)j=2,j<2不成立
4)输出换行,执行i++
(3)i=2,i<3成立
1)j=0,j<2成立,输出a[2][0]为0,执行j++
2)j=1,j<2成立,输出a[2][1]为0,执行j++
3)j=2,j<2不成立
4)输出换行,执行i++
(4)i=3,i<3不成立,结束循环
(5)输出的结果为:
10
20
00
26.答案选择:
B
分析:
指针数组的定义。
27.答案选择:
D
分析:
intc[4][5],(*p)[5];p=c;二维数组的引用有几种形式:
(1)直接引用:
c[i][j]
(2)指针当作数组用:
p[i][j]
(3)*(c[i]+j)
(4)*(p[i]+j)
(5)*(*(c+i)+j)
(6)*(*(p+i)+j)
28.答案选择:
D
分析:
根据27题中的几种形式来判断。
29.答案选择:
C
分析:
特别注意p[0]=a[1],判断的方法和27题中的几种形式来判断。
30.答案选择:
C
分析:
和上面几个题一样。
31.答案选择:
A
分析:
inta[][3]={{1,2,3},{4,5,0}},(*pa)[3],i;pa=a;试着和第九题比较一下看有什么地方不同。
(1)i=0,i<3为真,判断if表达式(i<2)为真,pa[1][0]=pa[1][0]-1,pa[1][0]=3,那么数组a中元素变为:
{{1,2,3},{3,5,0}},执行i++后i的值为1
(2)i=1,i<3为真,判断if表达式(i<2)为真,pa[1][1]=pa[1][1]-1,pa[1][1]=4,那么数组a中元素变为:
{{1,2,3},{3,4,0}},执行i++后i的值为2
(3)i=2,i<3为真,判断if表达式(i<2)为假,执行else:
pa[1][2]=1,那么数组a中元素变为:
{{1,2,3},{3,4,1}},执行i++后i的值为3
(4)i=3,i<3为假,结束循环
(5)输出a[0][1]+a[1][1]+a[1][2]的值为7
32.答案选择:
B
分析:
intb[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=1;
(1)i=0,i<3为真
1)j=0,j<=0为真,t=t+b[0][b[0][0]],即t=1+b[0][0],t的值为1,执行j++
2)j=1,j<=0为假,执行i++
(2)i=1,i<3为真
1)j=1,j<=1为真,t=t+b[1][b[1][1]],即t=1+b[1][1],t的值为2,执行j++
2)j=2,j<=1为假,执行i++
(3)i=2,i<3为真
1)j=2,j<=2为真,t=t+b[2][b[2][2]],即t=2+b[2][2],t的值为4,执行j++
2)j=3,j<=2为假,执行i++
(4)i=3,i<3为假,结束循环
(5)输出t的值为4
33、B
首先将格式printf(“%c”,‘’);改为printf(“%4c”,‘’);
本题中输出的是包括主对角线的右边的数据。
执行外循环中的语句:
A、i=0;i<4为真值,执行花括号中的语句。
1、执行内循环的第一个for语句,
①j=1,j<=i为假值,不执行内循环的第一个循环,退出第一个内循环。
2、执行内循环的第二个for语句。
该处是要输出第一行中的所有数据。
所以应该从数组的第一个数据开始输出,此时的变量i的值为0,填的内容为i.其他的三个选项值都不为0.
①j=0;j<4为真值,输出num[i][j],即1,此时%-4d代表的是输出的数据占有的宽度时4个宽度,并且以左对齐的方式输出。
执行完之后执行j++。
②j=1;j<4为真值,输出num[i][j],即2,此时%-4d代表的是输出的数据占有的宽度时4个宽度,并且以左对齐的方式输出。
执行完之后执行j++。
③j=2;j<4为真值,输出num[i][j],即3,此时%-4d代表的是输出的数据占有的宽度时4个宽度,并且以左对齐的方式输出。
执行完之后执行j++。
④j=3;j<4为真值,输出num[i][j],即4,此时%-4d代表的是输出的数据占有的宽度时4个宽度,并且以左对齐的方式输出。
执行完之后执行j++。
⑤j=4;j<4为假值,退出该循环。
执行后面的语句。
3、执行printf(“\n”);即:
换行。
执行完后返回到外循环的表达式3,i++;
B、i=1;i<4为真值,执行花括号中的语句。
1、执行内循环的第一个for语句,
①j=1,j<=i为真值,执行内循环的第一个循环,执行语句:
printf(“%4c”,‘’);即输出一个空格,该空格占有4个宽度。
执行完后执行表达式3,j++,
②j=2,j<=i为假值,不执行内循环的第一个循环,退出第一个内循环。
2、执行内循环的第二个for语句。
该处是要输出第二行中的后三个数据。
所以应该从数组的第二个数据开始输出,此时的变量i的值为1,填的内容为i.其他的三个选项值都不为1.
①j=1;j<4为真值,输出num[i][j],即6,此时%-4d代表的是输出的数据占有的宽度时4个宽度,并且以左对齐的方式输出。
执行完之后执行j++。
②j=2;j<4为真值,输出num[i][j],即7,此时%-4d代表的是输出的数据占有的宽度时4个宽度,并且以左对齐的方式输出。
执行完之后执行j++。
③j=3;j<4为真值,输出num[i][j],即8,此时%-4d代表的是输出的数据占有的宽度时4个宽度,并且以左对齐的方式输出。
执行完之后执行j++。
④j=4;j<4为假值,退出该循环。
执行后面的语句。
3、执行printf(“\n”);即:
换行。
执行完后返回到外循环的表达式3,i++;
C、i=2;i<4为真值,执行花括号中的语句。
1、执行内循环的第一个for语句,
①j=1,j<=i为真值,执行内循环的第一个循环,执行语句:
printf(“%4c”,‘’);即输出一个空格,该空格占有4个宽度。
执行完后执行表达式3,j++,
②j=2,j<=i为真值,执行内循环的第一个循环,执行语句:
printf(“%4c”,‘’);即输出一个空格,该空格占有4个宽度。
执行完后执行表达式3,j++,
③j=3,j<=i为假值,不执行内循环的第一个循环,退出第一个内循环。
2、执行内循环的第二个for语句。
该处是要输出第三行中的后2个数据。
所以应该从数组的第三个数据开始输出,此时的变量i的值为2,填的内容为i.其他的三个选项值都不为2.
①j=2;j<4为真值,输出num