哪位高手能告诉小弟我这两个输出为什么结果不一样

谁能告诉我这两个输出为什么结果不一样?
谁能解释一下,1跟2程序段为什么输出的不一样?

#include<iostream>
using namespace std;

struct fraction{
int num;
int denom;
};

int main()
{
fraction pi;
pi.num=22;
pi.denom=7;
/*  ---->1
((fraction*)&(pi.denom))->num=8;
((fraction*)&(pi.denom))->denom=10;
cout<<pi.num<<"   "<<pi.denom<<endl;
*/
//   --->2
((fraction*)&(pi.num))->num=8;
((fraction*)&(pi.num))->denom=10;
cout<<pi.num<<"   "<<pi.denom<<endl;
}

------解决方案--------------------
首先告诉你,这个程序简直充满了危险,如果你把num的声明向下放一位
你就有90%的可能得到一个程序崩溃.
第二个你获取pi.num的地址,
根据C++结构体布局,num的起始地址是和pi的一样的,所以没有问题
第一个denom起始地址和pi不一样所以不对,相当于你把denom得这个变量当成了fraction
你可以查看一下denom还有num的地址就Ok了
------解决方案--------------------
&pi.num == &pi(值一样,类型不同而已)
所以((fraction *)&pi.num)->num等同于(&pi)->num,即pi.num

&pi.denom 的值比&pi多一个int大小
所以((fraction *)&pi.denom)->num等同于(&pi)->denom,即pi.denom
((fraction *)&pi.denom)->denom则访问越界了

------解决方案--------------------
假设结构体分配得到的空间是2000-2007,每个int类型4个字节;
 ((fraction*)&(pi.denom))得到第二个int类型空间地址,指针指向2004;
((fraction*)&(pi.num))得到第一个int类型空间地址即是整个结构体空间地址,指针指向2000;
你输出的是从2000开始的两个int;
你在第一种后面输出 cout<<*(&pi.num+2)<<endl;就会得到一个10;这个10放在2008-2011这个空间里。我也是菜鸟,个人觉得是这个样子