C語言的聯合體與變體記錄

2021-10-12 13:51:52 字數 1389 閱讀 4143

結構體是將乙個物件(記憶體空間)解釋為c語言中多種型別的綜合.

聯合是將乙個物件(記憶體空間)在不同時候解釋為c語言中不同的型別.

// 聯合

typedef union firstuniontag firstunion

union firstunion ;

firstunion myunion;

使用 myunion.f 時, fi所佔記憶體中的內容將被解釋為乙個float數; 當使用 myunion.i 時, fi所佔記憶體中的內容將被解釋為乙個int型別.

可以對聯合進行初始化, 但是初始值必須是聯合第乙個成員的型別.

// 聯合初始化

// 聯合

typedef union firstuniontag firstunion

union firstunion ;

firstunion myunion = 3.1415;

變體記錄可以看作聯合的公升級版, 變體記錄中聯合成員是比int float更為複雜的結構.

考慮下面的情況:

倉庫儲存兩種貨物, 一種是零件(part), 一種是裝配件(subassembly), 裝配件由一些零件組成. 乙個零件資訊包括零件成本, 零件**商編號; 乙個裝配件資訊包括組成裝配件的零件數, 以及零件資訊. 顯然, 倉庫的一條存貨記錄(inventory)可能是零件, 也可能是裝配件, 並且包含入庫日期和操作員編號, 可以用變體記錄實現.

// 零件

struct partinfo ;

// 裝配件

struct subassyinfo ;

// 存貨記錄

struct invrec type;

union info;

} record;

我們可以通過以下方式訪問存貨記錄record.

record.oper 獲取存貨操作員編號

if(record.type == part) (存貨為零件, info為info.part) record.info.part.cost

獲取存貨零件成本 record.info.part.supplier 獲取存貨零件**商編號

if(record.type == subassy)(存貨為裝配件, info為info.subassy)

record.info.subassy.n_parts 獲取存貨裝配件包含零件數

record.info.subassy.parts[0].cost 獲取存貨裝配件第乙個零件的成本

C語言中的聯合體 (記錄)

在c語言中,一種和結構體非常類似的語法,叫做共用體 union 它的定義格式為 union 共用體名 結構體和共用體的區別在於 結構體的各個成員會占用不同的記憶體,互相之間沒有影響 而共用體的所有成員占用同一段記憶體,修改乙個成員會影響其餘所有成員。結構體占用的記憶體大於等於所有成員占用的記憶體的總...

c語言 union聯合體

linux中聯合體union實現判斷little endian 和 big endian 大端和小端 1 聯合體的資料成員從低位元組開始對齊 2 little endian 和 big endian。little endian 和 big endian 是 cpu 存放資料的兩種不同順序。對於整型 ...

C語言之聯合體

聯合體,就是將幾種資料型別聯合起來的一種資料結構,但是它們共用乙個空間。怎麼理解呢?川劇變臉見過沒,就是來來回回的變來變去,給人看的眼花繚亂的,但是不管你怎麼變,面具下的臉卻始終不變。同樣的道理,各種資料型別就是各種臉譜,對外展現了不同的形象,唯一不變的就是它的記憶體空間的二進位制資料始終都是一樣的...