c语言的一道题

若有以下程序段:structst{intn;int*m;};inta=2,b=3,c=5;structsts[3]=({101,&a},{102,&c},{103,&b}... 若有以下程序段:
struct st
{int n;
int *m;};
int a=2,b=3,c=5;
struct st s[3]=({101,&a},{102,&c},{103,&b}};
main()
{struct st *p;
p=s;
…}
则以下表达式中值为5的是( )。
A)(p++)->m

B)*(p++)->m

C)(*p).m

D)*(++p)->m

答案是选D 我选的是A,我觉的D选项不能这么用吧,要不就指针变量名->成员名,要不就(*指针变量名).成员名,不能这么用吧,A选项p++->和(p++)->意义一样吗?
展开
 我来答
瀚漠
2013-03-05 · 专注C语言发开,Linux系统相关
瀚漠
采纳数:309 获赞数:1286

向TA提问 私信TA
展开全部
做题目一般是用排除法,比较容易。

首先明确几点,p是指向结构体类型的指针,m是指向整形的指针,同时作为指针,想获得c的值即5,A和C可以同时排除:
A中的结果是个指针,不可能是5
C中语法错误,m是指针必须用->来访问

B和D的区别就在前加加和后加加,p是个指针,对指针做加加运算会跳过一个数据位,而数据位大小取决于p的类型,这里会跳过一个st结构体大小,p初始时指向s[0],加加之后会指向s[1],s[1]中的m指向的值正是我们需要的,显然前加加更适合,我们需要的就是加加立即生效。

至于你说的那个p++->和(p++)->的区别,没试过我无法回答你,我只能告诉你没人会这样写,如果需要自加运算,必然会加括号,属于不成文的规范。其实很多时候不用太纠结这些太细的东西。
stagezm
2013-03-05 · TA获得超过111个赞
知道答主
回答量:105
采纳率:0%
帮助的人:66.4万
展开全部
老哥:
首先先看指针对应结构体数组的位置:
第一位.[101,2]
第二位.[102,5]
第三位.[103,3]

当执行p=s;时 p 指针指向第一位,也就是[101,2]这项,能理解不?
接下来就是先++后++的问题啦

p++的意思是 先拿值再自加 意思是 先拿[101,2] ,本身再自加移动到下个位置去

++p的意思是 先自加后拿值 意思是 先自加移动到下个位置,再拿值 那自然拿出来的是5咯

PS:如果只用结构体指针的话,操作符使用->,不用指针的话是用 点号.

A选项p++->和(p++)->意义一样吗:
p++->这样的写法编译器会报错的吧,如果++在后面,正确的写法就是(p++)->
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhoujiong1004
2013-03-05 · TA获得超过357个赞
知道小有建树答主
回答量:402
采纳率:100%
帮助的人:353万
展开全部
这个是运算符优先级的问题,先进行括号里面的++p,然后p指向s[1],然后是进行->,最后才是取值~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Alan江南
2013-03-06 · TA获得超过185个赞
知道答主
回答量:318
采纳率:0%
帮助的人:147万
展开全部
这只是一个优先级的问题,先和括号结合,再->,最后才是*,取值,而且A的最后结果是个指针。然后再考虑前加加和后加加的问题
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式