六指针选择题答案.docx
- 文档编号:28585303
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:20
- 大小:20.98KB
六指针选择题答案.docx
《六指针选择题答案.docx》由会员分享,可在线阅读,更多相关《六指针选择题答案.docx(20页珍藏版)》请在冰豆网上搜索。
六指针选择题答案
六、指针
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],
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 指针 选择题 答案