C语言中不同类型的结构体的指针间可以强制转换

from:http://blog.csdn.net/flyqwang/article/details/6420228

C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险。只要理解了其内部机制,你会发现C是非常灵活的。

一.

结构体声明如何内存的分布, 
结构体指针声明结构体的首地址, 
结构体成员声明该成员在结构体中的偏移地址。

 

      变量的值是以二进制形式存储在内存中的,每个内存字节对应一个内存地址,而内存存储的值本身是没有整型,指针,字符等的区别的,区别的存在是因为我们对它们有不同的解读,peg的值就是一个32位值(这个值是某个地址),并且存储在某个内存单元中,通过这个32位值就能找到peg所指向的结构的起始地址,通过这个起始地址和各个结构所包含变量离起始地址的偏移对这些变量进行引用,peg->x只是这种引用更易读的写法,只要peg是指向point的指针,那么peg的值就肯定存在,peg存在,偏移量已知,那么param->x就肯定存在,只是要记住,peg->x只是代表了对peg一定偏移地址的值。

      不是说某个地址有那个结构体你才能引用,即使没有,你也能引用,因为你已经告诉了编译器peg变量就是指向一个eg结构体的变量并且指明了peg的值,机器码的眼中是没有数据结构一说的,它只是机械的按照指令的要求从内存地址取值,那刚才的例子来说,peg->x,peg->y的引用无论0x30000000是否存在一个eg结构体都是合法的,如果0x30000000开始的8个字节存在eg结构体,那么引用的就是这个结构体的值,如果这个位置是未定义的值,那么引用的结果就是这8个字节中的未定义值,内存位置总是存在的,而对内存中值的引用就是从这些内存位置对应的内存单元取值。

 

举个例子 :


typedef struct_eg 
{ 
     int x; 
     int y; 
}eg; 
int point = 0x30000000; 
eg *peg = (eg*)point;

可以看到point本身只是个整型变量,但是这样的赋值是合法的,peg->x的值是0x30000000开始的四字节,peg->y是0x30000004开始的四字节 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值