六、指针
183.下程序的运行结果是(A)。
void ast (int x,int y,int *cp,int *dp)
{ *cp=x+y; *dp=x-y;
}
main()
{ int a=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.有以下语句:
int a[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<p2
D.p1=p2
两个指针变量可以相减(结果表示介于二者之间元素的个数),可以比较大小,但不能相加。186.以下叙述错误的是(D)。
A.存放地址的变量称为指针变量
B.NULL可以赋值给任何类型的指针变量
C.一个指针变量只能指向类型相同的变量
D.两个相同类型的指针变量可以作加减运算
D两个相同类型的指针变量相加没有意义,所以不可以作加运算,所以D错。
187.以下程序段运行后,表达式*(p+4)的值为(B )。
char a[]="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)。
char a[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.若已定义: int q=5; 对①int *p=&q;和②p=&q; 这两条语句理解错误的是(C)。
A.①是对p定义时初始化,使p指向q;而②是将q的地址赋给p
B.①和②中的&q含义相同,都表示给指针变量赋值
C.①是对p定义时初始化,使p指向q;而②是将q的值赋给p所指向的变量
D.①和②的执行结果都是把q的地址赋给p
①int *p=&q; 是对p定义时初始化,使p的值等于q的地址
②p=&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.若有定义int a[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] .....
p p+1 p+2 p+3 p+4 p+5 p+6 .....
194.若已定义: int a=5,*p; 且p=&a; 则以下表示中不正确的是(B)。
A.&a==&(*p)
B.*(&p)==a
C.&(*p)==p
D.*(&a)==a
因为p=&a;所以*p==a,所以B错
195.若有以下程序段,则叙述正确的是(C)。
char s[]="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 数组长度和字符串长度是两个不同的概念。
数组长度是所有元素个数,char s[]="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 )。
enum weekday{ aa,bb=2,cc,dd,ee }week=ee;
printf("%d\n",week);
<
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];
int a[][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 )。
int a[]={1,2,3,4,5,6,7},*p=a;
int n,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 所以执行循环体
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论