#include <stdio.h>
typedef union{
int int_value;
} union_value;
int main(void){
int i=3;
int *ip=&i;
printf("%d\n",((union_value *)ip)->int_value);
return 0;
}
上面这段程序,我应该如何理解?union_value在内存中的表现形式难道和int一样?
没错,一样一样的。。。没有任何区别,都是四个字节嘛
内存只是存储数据的地方,至于数据是什么类型,是人控制的,编译器再根据人的意志生成对应指令
union占用的内存是它其中包含的最大的那个
比如下面的U占用的内存和short一样
union U {
char c;
short si;
};
/* sizeof(U) == 2 */
你的代码里只有一个int所以它占用的内存和int一样,所以强制转换后的结果也是正确的
作业吧?真实的代码里没有这么折腾的。
C语言的语法(强制类型转换),只是语法上的限制(这种限制是为了方便写代码和不会出现不期望的错误)
typedef union{
int int_value;
} union_value;
这个只是说 union_value
类型占了4个字节(32位系统),原因见wangdai的回答。然后int_vallue
相对于这个变量的起始偏移为0.
那么,现在 ip
指向了某个内存 ip->int_value
(不考虑强制类型转换)就是相当于*(ip+0)
,为什么是+0
,就是编译器根据typedef
推导出来的。