为了账号安全,请及时绑定邮箱和手机立即绑定

能帮我解释下这段程序的执行结果吗?

能帮我解释下这段程序的执行结果吗?

C
慕的地6264312 2023-04-21 19:15:29
struct ks{int a;int *b;}s[4], *p;main (){int n = 1, i;for (i = 0; i < 4; i++){s[i].a = n;s[i].b = &s[i].a;n = n + 2;}p = &s[0];p++;printf ("%d,%d\n", (++p) -> a, (p++) -> a);}
查看完整描述

1 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

分析:

一:
struct ks
{
int a;
int *b;
}s[4], *p;
定义了两个结构体变量, 分别是数组s和指针p.

二:
main函数中的for语句是给数组变量s赋值. 数组s的每个元素的成员指针变量b都指向了它本身的成员变量a.
赋值完后, s[0].a = 1, s[1].a = 3, s[2].a = 5, s[3].a = 7 .
且, s[0].b = &s[0].a, s[1].b = &s[1].a, s[2].b = &s[2].a, s[3].b = &s[3].a 

三:
p = &s[0];//结构体指针变量p指向了结构体数组变量s的第一个元素.
p++;//p指向了结构体数组变量s的第二个元素, 即s[1]的首地址.

四:
++p是先做++运算再取p的值, 而p++是先取p的得, 再做++运算.

故对于最后的打印语句:
printf ("%d,%d\n", (++p) -> a, (p++) -> a);

由上述的分析, 这时(++p)指向了s[2]的首地址. 所以(++p) -> a 的值是s[2].a的值, 即为5

而(p++)是指向了s[1]的首地址. 所以(p++) -> a的值是s[1].a的值, 即为3.

故最后的结果是: 5,3


查看完整回答
反对 回复 2023-04-23
  • 1 回答
  • 0 关注
  • 375 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信