C语言指针相关习题

网友投稿 271 2022-09-21

C语言指针相关习题

1.设有定义:int x=0,*p; 紧接着的赋值语句正确的是(B)

A.*p=NULL;B.p=NULL; C.p=x; D.*p=x;

解析:题目中定义指针变量p,指针变量的赋值只能赋予地址,决不能赋予任何其它数据,否则将引起错误。不允许把一个数赋予指针变量,被赋值的指针变量前不能再加”*说明符,因此B选项正确。

2.下列说法正确的是(C)

A)如果p是指针变量,则&p是不合法的表达式 B)如果p是指针变量,则p表示变量p的地址值 C)在对指针进行加、减算术运算时,数字1表示1个存储单元的长度 D)如果p是指针变量,则*p+1和*(p+1)的效果是一样的

【解析】B选项中,如果p是指针变量,则*p表示变量p所指向的地址的值;A选项中,如果p是指针变量,则&p表示变量p的地址;D选项中,如果p是指针变量,*p+1表示将p所指的值加上1,而*(p+1)表示的是先将指针右移一位再取所指向变量的值。因此C选项正确。

3.设有如下的说明和定义

struct{     int a;char*s; }x,*p=&x;x.a=4;x.s="hello";则以下叙述中正确的是(C)

A)(p++)->a与p++->a都是合语法的表达式,但二者不等价 B)语句++p->a:的效果是使p增1 C)语句++p->a;的效果是使成员a增1 D)语句*p->s++;等价于(p)->s++;

【解析】本题考查结构体变量的引用,++p->a的效果是使成员a增1,*p->s++为字符e,与(*p)->s++不等价。

因为取结构体成员操作符->的优先级大于​​指针运算符​​*,所以 *p->s就是*(p->s),s是char *,那么*(char *)结果是一个char,也就是结构变量x的成员字符串s的第一个字符。 而(*p)->s是语法错误,p是一个指向结构x的指针,*p就是x,是一个结构型变量,不能用->操作符。所以p++->a不合法。

4.若有以下程序

#includeint k=7,m=5;void f(int **s) { int *t=&k; s=&t; *s=&m; printf("%d,%d,%d,",k,*t,**s);}main() { int i=3,*p=&i,**r=&p; f(r); printf("%d%d%d\n",i,*p,**r);}

则程序输出的 结果是多少?

解析:首先我们来都f()函数里面的代码

​​int​​​ ​​*t=&k; t是一个变量,复制它的值是k的地址,*t就是k​​

s=&t; s是一个变量,它的值是t的地址,*s就是t

*s=&m; *s就是t,也就是把m的地址的值赋给t,那么t的值就变成了m的地址

​​printf​​​​(​​​​"%d,%d,%d,"​​​​,k,*t,**s);结果是7,5,5​​

​​再来看main()函数里面的代码​​

​​r的值传递给s,r和s是分别的2个变量,*r=*s=p,​​

​​但是f里面重新修改了s,那么变成了*s=t,没有改动过p,因此r没有变,p也没有变。​​

printf("%d%d%d\n",i,*p,**r);​​结果是3,3,3​​

【小结】

​​面对指针操作的时候,先撇开其度类型上的区别,比如问上边的s和t,他们本质都是一个变量,然后答记录了一个值,你只需要记录当s=&t时,*s就是t,然后一步步推理,就能分析清楚所有的指针操作,久而久之,熟能生巧。​​

​​至于类型上,记住一个关系:s=&t,那么s就该比t多一个*号,如t是int​​​ ​​*t,那么s就是​​​​int​​​ ​​**s​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:light oj 1159 - Batman LCS
下一篇:抖音的“戏精”达人们是如何吸粉百万的?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~