六指针选择题答案.docx

上传人:b****7 文档编号:11052578 上传时间:2023-02-24 格式:DOCX 页数:20 大小:20.98KB
下载 相关 举报
六指针选择题答案.docx_第1页
第1页 / 共20页
六指针选择题答案.docx_第2页
第2页 / 共20页
六指针选择题答案.docx_第3页
第3页 / 共20页
六指针选择题答案.docx_第4页
第4页 / 共20页
六指针选择题答案.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

六指针选择题答案.docx

《六指针选择题答案.docx》由会员分享,可在线阅读,更多相关《六指针选择题答案.docx(20页珍藏版)》请在冰豆网上搜索。

六指针选择题答案.docx

六指针选择题答案

六、指针

183.下程序的运行结果是(A)。

voidast(intx,inty,int*cp,int*dp)

{*cp=x+y;*dp=x-y;

}

main()

{inta=4,b=3,c,d;

ast(a,b,&c,&d);

printf("%d,%d\n",c,d);

}

A.7,1

B.1,7

C.7,-1

D.c、d未赋值,编译出错

执行ast(a,b,&c,&d);调用ast函数,把a传递给x,b传递给y,c的地址传递给cp,d的地址传递给dp.

因为cp=&c(cp的值为c变量的地址),所以*cp等价于c,

执行*cp=x+y;后c=4+3=7

同理,因为dp=&d,所以*dp等价于d,

执行*dp=x-y;后d=4-3=1

执行printf("%d,%d\n",c,d);后输出7,1

184.有以下语句:

inta[5]={0,1,2,3,4,5},i;

int*p=a;

设0≤i<5,对a数组元素不正确的引用是(C)。

A.*(&a[i])

B.a[p-a]

C.*(*(a+i))

D.p[i]

1.指针运算符

取地址运算符&:

其功能是取变量的地址。

2.取内容运算符*:

用来表示指针变量所指的变量。

在*运算符之后跟的变量必须是指针变量。

A.*(&a[i])等价于a[i]

B.a[p-a]等价于a[0]

C.因为*(a+i)等价于a[i]所以*(*(a+i))等价于*(a[i]),又因为在*运算符之后跟的变量必须是指针变量,我们断定*a[i]是错的,所以*(*(a+i))也是错。

D.因为P=a,所以P[i]等价于a[i]

185.若有定义int*p1,*p2;则错误的表达式是(A)。

A.p1+p2

B.p1-p2

C.p1

D.p1=p2

两个指针变量可以相减(结果表示介于二者之间元素的个数),可以比较大小,但不能相加。

186.以下叙述错误的是(D)。

A.存放地址的变量称为指针变量

B.NULL可以赋值给任何类型的指针变量

C.一个指针变量只能指向类型相同的变量

D.两个相同类型的指针变量可以作加减运算

D两个相同类型的指针变量相加没有意义,所以不可以作加运算,所以D错。

187.以下程序段运行后,表达式*(p+4)的值为(B)。

chara[]="china";

char*p;

p=a;

A.'n'

B.'a'

C.存放'n'的地址

D.存放'a'的地址

a是一维数组名,表示数组首地址,即等价于&a[0]

因为p=a;即p=&a[0],所以*p等价于a[0]

因为p=a;所以p+i等价于a+i,而a+i是a[i]的地址,*(a+i)等价于a[i]

所以*(p+i)等价于a[i]

*(p+4)=a[4]=’a’

188.以下程序段运行后,表达式*(p++)的值为(A)。

chara[5]="work";

char*p=a;

A.'w'

B.存放'w'的地址

C.'o'

D.存放'o'的地址

printf("%3d\n",(*p)++);/*先输出*p,再进行(*p)++*/

printf("%3d\n",*p++);/*先输出*p,再进行p++*/

printf("%3d\n",*++p);/*先进行++p,再输出*p*/

printf("%3d\n",++*p);/*先进行++(*p),再输出*p*/

*(p++)的值等于*p,然后p++

因为p等于a所以*p等于a[0]

189.若有定义:

int*p,k=4;p=&k;

以下均代表地址的是(C)。

A.k,p

B.&k,&p

C.&k,p

D.k,*p

A.k不是地址

B.k,p都是变量所以&k,&p都代表地址(&p是指针变量p的地址),所以B也是正确的

C.&k和p都是代表变量k的地址,所以C正确

D.K,*p都等于4,都不是地址

190.若有定义:

double*q,p;则能给输入项读入数据的正确程序段是(B)。

A.q=&p;scanf("%lf",*q);

B.q=&p;scanf("%lf",q);

C.*q=&p;scanf("%lf",q);

D.*q=&p;scanf("%lf",*q);

根据课本P37,调用scanf函数的语法格式为:

scanf(格式控制字符串,地址列表);所以

A.*q不是地址,所以A错

B.因为q=&p,即q等于p的地址,所以B正确

C.D.*q=&p错误

191.若已定义:

intq=5;对①int*p=&q;和②p=&q;这两条语句理解错误的是(C)。

A.①是对p定义时初始化,使p指向q;而②是将q的地址赋给p

B.①和②中的&q含义相同,都表示给指针变量赋值

C.①是对p定义时初始化,使p指向q;而②是将q的值赋给p所指向的变量

D.①和②的执行结果都是把q的地址赋给p

1int*p=&q;是对p定义时初始化,使p的值等于q的地址

2p=&q;是将q的地址赋值给p.

C中②理解错误。

应该是将q的地址赋值给p.

192.下面语句错误的是(A)。

A.int*p;*p=20;

B.char*s="abcdef";printf("%s\n",s);

C.char*str="abcdef";str++;

D.char*str;str="abcdef";

见课本P153,未经赋值的指针变量其值是随机的,可能指向系统或其他已使用的数据区,对它进行写入操作将可能出现不可预知的情况,严重时将造成系统混乱,甚至死机。

A没有对P赋值,就执行*p=20;对p所指向的单位进行写操作,可能会造成不可预知的错误,所以A错。

193.若有定义inta[2][3],*p=a;,则能表示数组元素a[1][2]地址的是(D)。

A.*(a[1]+2)

B.a[1][2]

C.p[5]

D.p+5

A.a[1]是第1行的首地址(行号从0开始计算),也是第1行的首个元素(第0个元素)的地址,即&a[1][0]

a[1]+2是表示从a[1][0]开始往移动2个位置,即a[1][2]的地址,

所以*(a[1]+2)等价于*(&a[1][2])等价于a[1][2],所以不能选A。

B.显然是错的

D.因为p=a,&a[i][j]等价于p+i*3+j其中3是数组a的列数

所以&a[1][2]等价于p+1*3+2,即p+5。

所以答案选D

因为p=a,即p等于a[0][0]的地址(指向a[0][0]),所以p+5是从a[0][0]开始往后偏移5个位置元素的地址,即p+5是a[5]的地址

a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a[2][0].....

pp+1p+2p+3p+4p+5p+6.....

194.若已定义:

inta=5,*p;且p=&a;则以下表示中不正确的是(B)。

A.&a==&(*p)

B.*(&p)==a

C.&(*p)==p

D.*(&a)==a

因为p=&a;所以*p==a,所以B错

195.若有以下程序段,则叙述正确的是(C)。

chars[]="computer";

char*p;

p=s;

A.s和p完全相同

B.数组s的长度和p所指向的字符串长度相等

C.*p与s[0]相等

D.数组s中的内容和指针变量p中的内容相等

A.s是数组名,代表一个固定的地址(指针常量),s的值是不能改变的。

P的是指针变量,可以对p的进行赋值(p的值可程序运行过程中可以修改),所以A错。

B数组长度和字符串长度是两个不同的概念。

数组长度是所有元素个数,chars[]="computer";数组长度为9(a[8]==’/0’)

字符串商都是指字符串中字符的个数(不包括字符串结束标志/0),p所指向的字符串是"computer",有8个字符,所以字符串长度为8

所以B错

C.s等价于&s[0],所以*p等价于s[0],所以答案选C

D.数组s中的内容:

s[0]=’c’,s[1]=’o’,....,s[7]=’r’,s[8]=’\0’

指针变量p中的内容是s,即数组s的首地址(&s[0]),所以D是错的。

196.以下程序段的运行结果是(B)。

enumweekday{aa,bb=2,cc,dd,ee}week=ee;

printf("%d\n",week);

A.ee

B.5

C.2

D.4

课本P277

week是枚举类型变量,它的取值为ee,

因为bb=2,所以cc=3,dd=4,ee=5

以%d格式输出ee,结果为5

197.若有以下程序段,则不能正确访问数组元素a[1][2]的是(A)。

int(*p)[3];

inta[][3]={1,2,3,4,5,6,7,8,9};

p=a;

A.p[1]+2

B.p[1][2]

C.(*(p+1))[2]

D.*(*(a+1)+2)

P是指向一维数组(有3个元素)的指针变量,详细见课本P164——3。

因为p=a;所以p[1]+2等价于a[1]+2,而a[1]+2等价于&a[1][2],所以p[1]+2等价于&a[1][2]

所以A错

198.以下程序段的运行结果是(A)。

inta[]={1,2,3,4,5,6,7},*p=a;

intn,sum=0;

for(n=1;n<6;n++)sum+=p[n++];

printf("%d",sum);

A.12

B.15

C.16

D.27

因为p=a,所以p[n]等价于a[n]

执行for(n=1;n<6;n++)sum+=p[n++];

当n=1时满足n<6所以执行循环体

sum=sum+p[1]=0+2=2,然后n自增1两次,n的值变为3

当n=3时满足n<6所以执行循环体

sum=sum+p[3]=2+4=6,然后n自增1两次,n的值变为5

当n=5时满足n<6所以执行循环体

sum=sum+p[5]=6+6=12,然后n自增1两次,n的值变为7

当n=7时不满足n<6所以结束循环。

最后sum的值为12。

所以答案选A

199.下面程序的运行结果是(A)。

main()

{inta,b;

int*p1=&a,*p2=&b,*t;

a=10;b=20;

t=p1;p1=p2;p2=t;

printf("%d,%d\n",a,b);

}

A.10,20

B.20,10

C.10,10

D.20,20

因为

int*p1=&a,*p2=&b,*t;

a=10;b=20;

所以p1指向变量a,p2指向变量b,

这时候a等于10,b等于20,*p1等于10,*p2等于20

执行t=p1;p1=p2;p2=t;后

P1指向变量b,p2指向变量a,

这时候a等于10,b等于20,*p1等于20,*p2等于10

所以答案选A

200.以下程序段运行后变量s的值为(C)。

inta[]={1,2,3,4,5,6,7};

inti,s=1,*p;

p=&a[3];

for(i=0;i<3;i++)

s*=*(p+i);

A.6

B.60

C.120

D.210

p=&a[3];p指向a[3]

当i=0时

s=s*(*(p+0))=s*a[3]=1*4=4;

当i=1时

s=s*(*(p+1))=s*a[4]=4*5=20;

当i=2时

s=s*(*(p+2))=s*a[5]=20*6=120;

所以最后s=120,答案选C

201.以下程序段运行后变量ans的值为(B)。

inta[]={1,2,3},b[]={3,2,1};

int*p=a,*q=b;

intk,ans=0;

for(k=0;k<3;k++)

if(*(p+k)==*(q+k))

ans=ans+*(p+k)*2;

A.2

B.4

C.6

D.12

inta[]={1,2,3},b[]={3,2,1};

int*p=a,*q=b;

p指向a[0]q指向b[0]

执行

for(k=0;k<3;k++)

if(*(p+k)==*(q+k))

ans=ans+*(p+k)*2;

当k=0时

*(p+k)=a[k]=a[0]=1

*(q+k)=b[k]=a[0]=3

所以*(p+k)==*(q+k)不成立,

k++,满足k<3,所以进入下一次循环

当k=1时

*(p+k)=a[k]=a[1]=3

*(q+k)=b[k]=a[1]=1

所以*(p+k)==*(q+k)成立,执行ans=ans+*(p+k)*2;

ans=ans+*(p+k)*2=0+a[k]*2=0+a[1]*2=0+2*2=4

然后k++,满足k<3,所以进入下一次循环

当k=2时

*(p+k)=a[k]=a[2]=1

*(q+k)=b[k]=a[2]=3

所以*(p+k)==*(q+k)不成立,

k++,不满足k<3,所以结束循环

最后ans=4,答案选B

202.以下程序运行结果是(A)。

main()

{chara[]="abc",*p;

for(p=a;p

printf("%s",p);

}

A.abcbcc

B.abc

C.cbabaa

D.cba

printf("%s",p);是输出p所指向的字符串

a+i等价于&a[i]

for(p=a;p

printf("%s",p);

当p==a时

p指向a[0],所以printf("%s",p);输出以地址&a[0]开始的字符串,即输出”abc”

当p==a+1时

p指向a[1],所以printf("%s",p);输出以地址&a[1]开始的字符串,即输出”bc”

当p=a+2时

p指向a[2],所以printf("%s",p);输出以地址&a[2]开始的字符串,即输出”c”

所以最后输出结果为:

abcbcc,答案选A

203.以下程序的输出结果是(B)。

#include

voidmain()

{inti;

char*s="ABCD";

for(i=0;i<3;i++)

printf("%s\n",s+i);

}

A.CD

BCD

ABCD

B.ABCD

BCD

CD

C.AB

ABC

ABCD

D.ABCD

ABC

AB

s+i第i个字符的地址

执行

for(i=0;i<3;i++)

printf("%s\n",s+i);

当i=0时

printf("%s\n",s+i);输出”ABCD”,然后回车换行

当i=1时

printf("%s\n",s+i);输出”BCD”,然后回车换行

当i=2时

printf("%s\n",s+i);输出”CD”,然后回车换行

所以答案选B

204.以下程序的输出结果是(B)。

#include

voidmain()

{char*p="ABCDE",*q=p+3;

printf("%c\n",q[-2]);

}

A.A

B.B

C.C

D.D

q[i]等价于*(q+i)

所以q[-2]等价于*(q-2)

因为q=p+3,所以*(q-2)等于*(p+3-2)即*(p+1)即B

答案选B

205.下面程序执行时,若输入54321<回车>,则输出为:

B

#include

#defineN5

voidmain()

{inta[N];

int*p=a;

while(p

scanf("%d",p++);

while(p>a)

printf("%d",*(--p));

}

A.54321

B.12345

C.34512

D.32154

int*p=a;

p指向a[0],

while(p

scanf("%d",p++);

第一次循环:

scanf("%d",p++);把5赋值给a[0],然后p++,(p值变为a+1),p指向a[1]

第二次循环:

scanf("%d",p++);把4赋值给a[1],然后p++,(p值变为a+2),p指向a[2]

第三次循环:

scanf("%d",p++);把3赋值给a[2],然后p++,(p值变为a+3),p指向a[3]

第四次循环:

scanf("%d",p++);把2赋值给a[3],然后p++,(p值变为a+3),p指向a[4]

第五次循环:

scanf("%d",p++);把1赋值给a[4],然后p++,(p值变为a+5),不满足p

while(p>a)

printf("%d",*(--p));

p的值为a+5,满足p>a,执行循环体

第一次循环:

printf("%d",*(--p));p自减1(值变为a+4),然后输出*p(输出a[4])

p的值为a+4,满足p>a,执行循环体

第二次循环:

printf("%d",*(--p));p自减1(值变为a+3),然后输出*p(输出a[3])

p的值为a+3,满足p>a,执行循环体

第三次循环:

printf("%d",*(--p));p自减1(值变为a+2),然后输出*p(输出a[2])

p的值为a+2,满足p>a,执行循环体

第四次循环:

printf("%d",*(--p));p自减1(值变为a+1),然后输出*p(输出a[1])

p的值为a+1,满足p>a,执行循环体

第五次循环:

printf("%d",*(--p));p自减1(值变为a),然后输出*p(输出a[0])

p的值为a,不满足p>a,结束循环。

最后输出12345所以答案选B

206.下面程序段的运行结果是(C)。

inta[]={1,2,3,4,5,6},*p=a;

inti,sum=0;

for(i=1;i<6;i++)sum+=*(p++);

printf("%d",sum);

A.10

B.12

C.15

D.20

*(p++);/*先输出*p,再进行p++*/

p=a;p指向a[0]

for(i=1;i<6;i++)sum+=*(p++);

当i=1时

sum=sum+*p=sum+a[0]=0+1=1;然后p++,p的值变为a+1,即p指向a[1]

当i=2时

sum=sum+*p=sum+a[1]=1+2=3;然后p++,p的值变为a+2,即p指向a[2]

当i=3时

sum=sum+*p=sum+a[2]=3+3=6;然后p++,p的值变为a+3,即p指向a[3]

当i=4时

sum=sum+*p=sum+a[3]=6+4=10;然后p++,p的值变为a+4,即p指向a[4]

当i=5时

sum=sum+*p=sum+a[4]=10+5=15;然后p++,p的值变为a+5,即p指向a[5]

最后printf("%d",sum);输出15,答案选C

207.下面程序运行结果是(D)。

main()

{inta[]={1,2,3,4,5},*p,*q,i;

p=a;q=p+4;

for(i=1;i<5;i++)

printf("%d%d",*(q-i),*(p+i));

}

A.24334251

B.51423324

C.15243342

D.42332415

p=a;p指向a[0]

q=p+4;q指向a[4]

for(i=1;i<5;i++)

printf("%d%d",*(q-i),*(p+i));

当i=1时

printf("%d%d",*(q-i),*(p+i));输出a[3]和a[1],即输出42

当i=2时

printf("%d%d",*(q-i),*(p+i));输出a[2]和a[2],即输出33

当i=3时

printf("%d%d",*(q-i),*(p+i));输出a[1]和a[3],即输出25

当i=4时

printf("%d%d",*(q-i),*(p+i));输出a[0]和a[4],即输出15

最后输出结果:

42332515,所以答案选D

208.下面程序运行结果是(B)。

main()

{staticchara[]="abcdefg",b[]="adcbehg";

char*p=a,*q=b;

inti;

for(i=0;i<=6;i++)

if(*(p+i)==*(q+i))

printf("%c",*(q+i));

}

A.geca

B.aceg

C.bdf

D.Fdb

这个程序的功能是比较数组a和数组b中相同位置上相等的元素是否相等,如果相等则输出该元素。

char*p=a,*q=b;p指向a[0],q指向b[0]

*(p+i)等价于a[i]

*(q+i)等价于b[i]

for(i=0;i<=6;i++)

if(*(p+i)==*(q+i))

printf("%c",*(q+i));

当i=0时

*(p+i)的值为’a’

*(q+i)的值为’a’

满足*(p+i)==*(q+i),所以执行printf("%c",*(q+i));输出’a’

当i=1时

*(p+i)的值为’b’

*(q+i)的值为’d’

不满足*(p+i)==*(q+i),所以不执行printf("%c",*(q+i));

当i=2时

*(p+i)的值为’c’

*(q+i)的值为’c’

满足*(p+i)==*(q+i),所以执行printf("%c",*(q+i));输出’c’

当i=3时

*(p+i)的值为’d’

*(q+i)的值为’b’

不满足*(p+i)==*(q+i),所以不执行printf("%c",*(q+i));

当i=4时

*(p+i)的值为’e’

*(q+i)的值为’e’

满足*(p+i)==*(q+i),所以执行printf("%c",*(q+i));输出’e’

当i=5时

*(p+i)的值为’g’

*(q+i)的值为’g’

满足*(p+i)==*(q+i),

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1