C语言 (*p).n 与 p-n 的区别

[复制链接]
查看11 | 回复9 | 2011-2-21 12:08:41 | 显示全部楼层 |阅读模式
回复

使用道具 举报

千问 | 2011-2-21 12:08:41 | 显示全部楼层
<pre id=\\\"best-answer-content\\\">为你画了一个简单的图,这道题你之所以没有搞清,是因为你没有了解p和*p和a的含义
我简单的说一下,你看能否明白!
首先这道题是一个链表,你能明白吧?就像图上画的,a是链表的指针,a就是这条链表的首地址,而a[0]就是这个链表的首个元素!
再说p,注意题目的这句话!p =
你懂么?n
b) p-n
c) (*p).n
d)p-n

先说a
题目p执行,p指向a[1],我就不说结果了……
再说b
p-n是5,然后却是6,但是注意这句话是在执行后变为6,如果
coutp-nendl;
结果是5,注意!
再说c
*p是数
*p就是a[0]
a[0].n的执行顺序是先“.”在“”结果任然是6!!!
最后说d
p-n和c完全一样
p-n等于a-n
也就是a-n等价于a[0].n,仍然为6
回复

使用道具 举报

千问 | 2011-2-21 12:08:41 | 显示全部楼层
<p>

<pre class=\\\"answer-content\\\">这个问题不多说。
百度一下bcwhy

</p>
回复

使用道具 举报

千问 | 2011-2-21 12:08:41 | 显示全部楼层
<p>

<pre class=\\\"answer-content\\\">C语言中(*p)并不能表示结构体st,必须是p-n表示具体指向结构体中哪个数据,此时不用加*就表示这个数据了
(*p).n语法不对,结构体没有*P这种表示法

</p>
回复

使用道具 举报

千问 | 2011-2-21 12:08:41 | 显示全部楼层
<p>

<pre class=\\\"answer-content\\\">c、d都是对的,不信你自己上机试试

</p>
回复

使用道具 举报

千问 | 2011-2-21 12:08:41 | 显示全部楼层
<p>

<pre class=\\\"answer-content\\\">按优先级顺序()-. 大于
a) p-n
先执行p-n=5,然后在p,p指向a[1],表达式值是5
b) p-n
先执行p-n=5,然后在n=6,表达式值是5
c) (*p).n先执行(*p).n=5,然后在n=6,表达式值是6
d)p-n
先执行p-n=5,然后在n=6,表达式值是6
对于指针p,(*p).n=p-n,p-n只是方便书写,同(n

</p>
回复

使用道具 举报

千问 | 2011-2-21 12:08:41 | 显示全部楼层
<p>

<pre class=\\\"answer-content\\\">这个问题,前几天出现过,当时的最佳答案是错误的,当时我在评论中也提出了:C、D都正确。
a) p-n
先取p-n的值,也就是5,所以表达式结果为5。然后p指针再加1,即p指向a[1]。
b) p-n
先取p-n的值,也就是5,所以表达式结果为5。然后再将p-n加1,p是指向a[0]的,最后a[0].n现在等于6。
c) (*p).n将(*p).n的值加1,所以表达式值是6
d)p-n 将的值加1,所以表达式值是6
这主要注意这几个问题:
1.单目运算符的级别更高,也就是\\\'-\\\'、\\\'.\\\'、的级别高于;
2.左,是先加1,再取值;右,是先取值,再加1;

</p>
回复

使用道具 举报

千问 | 2011-2-21 12:08:41 | 显示全部楼层
<p>

<pre class=\\\"answer-content\\\">答案错误,c和d都是6

</p>
回复

使用道具 举报

千问 | 2011-2-21 12:08:41 | 显示全部楼层
<p>

<pre class=\\\"answer-content\\\">c也正确,写个程序验证一下:
#include stdio.h

struct st {

int n;

struct st *next;
} a[3], *p;

void st_init(void)
{

a[0].n = 5;

a[0].next =

a[1].n = 7;

a[1].next =

a[2].n = 9;

a[2].next = NULL;

p = a;


return ;
}


void st_print(void)
{

printf(\\\"p-n = %d\\\\np-n = %d\\\\n(*p).n = %d\\\\np-n = %d\\\\n\\\\n\\\",

p-n, p-n, (*p).n, p-n);


return ;
}


int main(int argc, char **argv)
{

st_init();

printf(\\\"(初始值)\\\\np = %p\\\\np-n = %d\\\\n\\\\n\\\", p, p-n);


printf(\\\"p-n = %d\\\\n\\\", p-n);

printf(\\\"p = %p\\\\np-n = %d\\\\n\\\\n\\\", p, p-n);


st_init();

printf(\\\"p-n = %d\\\\n\\\", p-n);

printf(\\\"p = %p\\\\np-n = %d\\\\n\\\\n\\\", p, p-n);


st_init();

printf(\\\"(*p).n = %d\\\\n\\\", (*p).n);

printf(\\\"p = %p\\\\np-n = %d\\\\n\\\\n\\\", p, p-n);


st_init();

printf(\\\"p-n = %d\\\\n\\\", p-n);

printf(\\\"p = %p\\\\np-n = %d\\\\n\\\\n\\\", p, p-n);


return 0;
}

结果:
(初始值)
p = 0x80498bc
p-n = 5

p-n = 5
p = 0x80498c4
p-n = 7

p-n = 5
p = 0x80498bc
p-n = 6

(*p).n = 6
p = 0x80498bc
p-n = 6

p-n = 6
p = 0x80498bc
p-n = 6

</p>
回复

使用道具 举报

千问 | 2011-2-21 12:08:41 | 显示全部楼层
<p>

<pre class=\\\"answer-content\\\">图片就是答案

</p>




<a href=\\\"#\\\" id=\\\"image-222779396_620035952\\\" target=\\\"_blank\\\"></a>
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行