Union聯合體

一. 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

 

即 獲取內存中字節時從低地址開始,將獲取的字節從高地址到低地址排序,獲得的值纔是變量的值

相關文章
相關標籤/搜索