一. union的聲明和struct相似spa
1 union 名稱 { 2 //成員變量 3 }; 4 5 typedef union { 6 //成員變量 7 }名字;
二. 內存分配3d
1. union內存大小須要知足如下2個條件:code
1> 大於或等於union中最長的成員變量的長度;blog
2> 能整除其餘成員變量長度排序
文字描述計算過程:U001中的成員變量 int number->4字節,char c[10]->10字節,double tmp->8字節, 要大於或等於10,還須要能整除4和8,U001的大小爲16字節內存
2. union中的成員變量是不共存的,全部成員變量的起始地址相對於union基地址偏移量都是0,即union建立時分配的內存空間,全部的成員變量共用,新值會覆蓋舊值it
3. 判斷union起始地址是低地址仍是高地址io
從Log能夠看出c[0]地址小於c[1],因此在個人機子上,union起始地址是低地址,即小端little-endianclass
4. union怎麼存儲和讀取成員變量的值變量
ASCII字符‘A’對應16進制4一、10進制65,‘B’對應16進制4二、10進制66,'C'對應16進制4三、10進制67, 'D'對應16進制4四、10進制68
char類型1個字節,int4個字節,給聯合體實例u1的成員變量char c[10]前4個字節賦值,正好對應int的4個字節,
以16進制形式打印u1.number能夠獲得44434241,說明union的存取是這個樣子的:
4-1> 建立出聯合體實例u1後,u1的內存以下
4-2> 賦值u1.c[0] = 'A'; 成員變量char c[10]擁有10個字節長度,c[0]從低地址開始找到第1個字節即byte0, 賦值u1.c[0]後,內存變爲:
4-3> 賦值u1.c[1] = 'B'; 從低地址開始找到第2個字節即byte1, 賦值u1.c[1]後,內存變爲:
4-4> 賦值u1.c[2] = 'C'; 從低地址開始找到第3個字節即byte2, 賦值u1.c[2]後,內存變爲:
4-5> 賦值u1.c[3] = 'D'; 從低地址開始找到第4個字節即byte3, 賦值u1.c[3]後,內存變爲:
4-6> 讀取u1.number, int類型4個字節,從低地址依次讀取4個字節byte0 byte1 byte2 byte3,
將這4個字節按照從高地址到低地址排列組合爲byte3 byte2 byte1 byte0
即 獲取內存中字節時從低地址開始,將獲取的字節從高地址到低地址排序,獲得的值纔是變量的值