今天看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(); }