今天看php源码看到 zval 结构里的 zvalue_value 是由 union 实现的,以前没有用过这个关键词,因此来学一下。php
union 百度百科定义
数据结构
union 是数据的一种构造类型的数据结构。也就是说它和struct相似。url
第一个问题
code
它和struct的区别的在哪里?内存
struct 结构体变量中的每一个成员各自占用一段内存互不干扰(举个例子,四我的租了一个房子,都比较穷哈,可是有隔断,每一个人使用本身的空间对别的成员不形成影响)get
union结构体变量中的全部成员公用一段内存,同一时间段只能存贮一个成员变量(四我的租了一个房间的不一样时间段,仍是摆脱不了穷的命运哈,一我的入住后,别的成员就得等这我的使用完后才能进,当第二个成员进来后要放本身的东西,因此原先第一个成员的全部东西都会被扔掉)。源码
附实验代码 C 实现
io
#include <stdio.h> int main() { union name { char *a; int b; // double c; }xiaohong; xiaohong.a = "hello world"; // xiaohong.c = 0.11; printf("a:%s,b:%d.\n", xiaohong.a, xiaohong.b); // xiaohong.b = 11; // printf("a:%s,b:%d.\n", xiaohong.a, xiaohong.b); return 0; }
还有疑问还没有解开编译
假设有一联合体A 有成员a,b 当给a赋值后,此时b的值是多少(经上面的实验b的值是有的可是我没有给b赋值),此时b的值表明的是b的地址仍是什么?
class
union和struct结合使用的例子(下面的例子编译不经过,找不到缘由,备忘一下)
#include <stdio.h> void main() { union number { /*定义一个联合*/ int i; struct { /*在联合中定义一个结构*/ char first; char second; }half; }num; num.i=0x4241; /*联合成员赋值*/ printf("%c%c\n", num.half.first, num.half.second); num.half.first='a'; /*联合中结构成员赋值*/ num.half.second='b'; printf("%x\n", num.i); getchar(); }