C C 語言中聯合體union的妙用

2021-09-09 06:59:32 字數 1004 閱讀 2659

聯合體union的基本概念

在c/c++語言中,有時需要在同一段記憶體單元中存放不同型別的變數,如把乙個整形變數int、乙個字元型變數char和乙個雙精度實型變數double放在同乙個位址開始的記憶體單元中,這3個變數雖然在記憶體中佔的位元組數不同,但都從同一位址開始,使用覆蓋技術,後乙個資料覆蓋了前面的資料。這便是聯合體union(或者叫共用體)誕生的目的所在。其主要特點是:

union中可以定義多個成員,union的大小由最大的成員的大小決定union成員共享同一塊大小的記憶體,一次只能使用其中的乙個成員對union某乙個成員賦值,會覆蓋其他成員的值

從上面也可以看出,聯合體與c語言中的結構體有一些相似之處,但兩者有本質上的不同。在結構體中各成員有各自的記憶體空間, 乙個結構變數的總長度是各成員長度之和(空結構除外,同時不考慮邊界調整)。而在聯合體中,各成員共享一段記憶體空間, 乙個聯合變數的長度等於各成員中最長的長度。

聯合體union的定義方式

在c/c++語言中,常見的3種定義方式如下:

宣告的同時定義變數先宣告,再定義變數匿名定義變數

下圖給出了3種定義方式的乙個例子:

聯合體union的使用例子

使用聯合體型別,可以實現一些我們意想不到或其它程式語言很難做到的功能,下面給出2個例子。

(1) 將乙個32位的整型數拆分為4個單位元組的數

如將乙個數0x12345678拆分為4個單位元組的數為:0x78、0x56、0x34、0x12,則主要實現**如下:

(2) 判斷當前作業系統的位元組序的大、小端問題

主要原理為:在聯合體中定義乙個4位元組整數i和乙個單位元組整數ch,且賦值i為1(16進製表示為0x00 00 00 01),利用聯合體中所有變數共享記憶體區域的特性,若系統是小端序,則該聯合體的低位址端存放的是數值i的低位位元組(0x01),反之,若系統是大端序,則存放的是數值i的高位位元組(0x00),那麼可根據ch的值(存放在該聯合體的低位址端,非0即1)來判斷當前系統的位元組序問題。對應的實現函式**如下:

對於上面2個例子,完整的實現**如下:

執行結果如下圖所示:

C語言中聯合體union的使用

本文編輯整理自 一 前言 聯合體 union 與 結構體 struct 有一些相似之處。但兩者有本質上的不同。在結構體中,各成員有各自的記憶體空間,乙個結構變數的總長度是各成員長度之和 而在 聯合 中,各成員共享一段記憶體空間,乙個聯合變數的長度等於各成員中最長的長度 應該說明的是,這裡所謂的共享不...

C語言中聯合體union的使用

一 前言 聯合體 union 與 結構體 struct 有一些相似之處。但兩者有本質上的不同。在結構體中,各成員有各自的記憶體空間,乙個結構變數的總長度是各成員長度之和 而在 聯合 中,各成員共享一段記憶體空間,乙個聯合變數的長度等於各成員中最長的長度 應該說明的是,這裡所謂的共享不是指把多個成員同...

C 中聯合體(union)的使用

1 typedef union para 2np 11 npara 12 或者如下所示 13union para 14np 23 24typedef union para npara 2526 詳細可以參看typedef的用法,本文主要講解union的用法,不再贅述 union聯合體的用法 例如利用...