c语言sscanf函数的用法是什么
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.若有以下程序
#include
则程序输出的 结果是多少?
解析:首先我们来都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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~