聯合體 位域結構體 聯合體的妙用

2021-10-12 09:04:08 字數 3618 閱讀 1775

在c語言中,變數的定義是分配儲存空間的過程。一般的,每個變數都具有其獨有的儲存空間,那麼可不可以在同乙個記憶體空間中儲存不同的資料型別(不是同事儲存)呢?

答案是可以的,使用聯合體就可以達到這樣的目的。聯合體也叫共用體,在c語言中定義聯合體的關鍵字是union

定義乙個聯合型別的一般形式為:

union 聯合名

;

成員表中含有若干成員,成員的一般形式為:型別說明符 成員名。其占用的位元組數與成員中最大資料型別占用的位元組數。

結構體(struct)列舉(enum)一樣,聯合體也是一種構造型別:

關於結構體與列舉的知識可檢視往期筆記:

【c語言筆記】結構體

【c語言筆記】列舉

建立聯合和建立結構的方式相同,需要乙個聯合模板和聯合變數。下面是幾種定義聯合體變數的方法:

// 建立聯合體模板union perdata

union perdata

;// 使用該聯合體模板建立兩個變數a, b

union perdata a,b;

此處,perdata是聯合體名,該名字是由我們任意定的,但是盡量起個有意義的名稱。其相當於乙個模板,可以使用這個模板去定義變數a、b。定義的時候不要忘了union

// 建立聯合體模板union perdata的同時定義兩個變數a、b

union perdata

a,b;

這與方法一差不多。

union

a,b;

相對於方法一與方法二,此處省略了聯合體名。雖然更簡潔了,但是因為沒有了名字,後面就不能用該聯合體定義新的變數。

// 聯合體模板union perdata重新命名為perdata_u

typedef union perdata

perdata_u;

// 使用新名字perdata_u建立兩個變數a, b

perdata_u a,b;

此處使用typedef為聯合體模板union perdata定義乙個別名perdata_u。關於typedef關鍵字可檢視往期筆記:

【c語言筆記】#define與typedef的區別?

聯合體的初始化與結構體不同,聯合體只能儲存乙個值。聯合體有三種初始化方法:

左右滑動檢視全部**》

perdata_u a;

a.class = 10;

perdata_u b = a; /* 1、把乙個聯合初始化為另乙個同型別的聯合;*/

perdata_u c = ; /* 2、初始化聯合的第乙個成員;*/

perdata_u d = ; /* 3、根據c99標準,使用指定初始化器。*/

之前分享的《什麼是大小端模式?中已經有介紹怎麼判斷當預處理器的大小端問題:

現在,可以使用聯合體來做判斷:

微控制器中經常會遇見分離高低位元組的操作,比如進行計時中斷復位操作時往往會進行

(65535-200)/256,

(65535-200)%256

這樣的操作,而乙個除法消耗四個機器週期,取餘也需要進行一系列複雜的運算,如果在短時間內需要進行很多次這樣的運算無疑會給程式帶來巨大的負擔。

其實進行這些操作的時候我們需要的僅僅是高低位元組的資料分離而已,這樣利用聯合體我們很容易降低這部分開銷。

**:

左右滑動檢視全部**》

union div

test;

test.n = 65535-200; // 進行完這句後就一切ok了,下面通過訪問test中陣列a的資料來取出高低位元組的資料

th1 = test.a[0]; // test.a[0]中儲存的是高位資料

tl1 = test.a[1]; // test.a[1]中儲存了test.n的低位資料

聯合體內資料是按位址對齊的。具體是高位資料還是低位資料要看平台的大小端模式,51是大端,stm32預設是小端,如果其他編譯器還請自測。

僅僅用了一條減法指令就達到了除法、取餘的操作,在進行高頻率定時時尤為有用。

看看ti韌體庫中暫存器是怎麼封裝的:

所有的暫存器被封裝成聯合體型別的變數,聯合體裡邊的成員是乙個32bit的整數及乙個結構體,該結構體以位域的形式體現。這樣就可以達到直接操控暫存器的某些位了。

比如,我們要設定pa0引腳的gpaqsel1暫存器的[1:0]兩位都為1,則我們只操控兩個bit就可以很方便的這麼設定:

gpioctrlregs.gpaqsel1.bit.gpio0 = 3

或者直接操控整個暫存器:

gpioctrlregs.gpaqsel1.all |=0x03 

以上就是關於聯合體的一點總結筆記,如有錯誤,歡迎指出!

1、

2、《c primer plus》第6版

往期精彩筆記:【socket應用】基於c語言的天氣客戶端的實現教你寫乙個定時關機程式【c語言筆記】關於陣列的乙個陷阱!

【c語言筆記】指定初始化器

聊天介面輸入m獲取往期筆記目錄

聯合體,位域, 結構體對齊

聯合體union 當多個資料需要共享記憶體或者多個資料每次只取其一時,可以利用聯合體 union 在c programming language 一書中對於聯合體是這麼描述的 1 聯合體是乙個結構 2 它的所有成員相對於基位址的偏移量都為0 3 此結構空間要大到足夠容納最 寬 的成員 1下面解釋這四...

聯合體,結構體妙用法

聯合體,結構體妙用法 摘自 zhengnl 嵌入式大雜燴 在c語言中定義聯合體的關鍵字是union 定義乙個聯合型別的一般形式為 union 聯合名 實用技巧 1 示例 enum data pkg type struct data pkg1 struct data pkg2 struct data ...

結構體聯合體

在c中,結構也是一種資料型別,可以使用結構變數,因此,象其它型別的變數一樣,在使用結構變數時要先對其定義。定義結構變數的一般格式為 struct 結構名 結構變數 結構名是結構的識別符號不是變數名。型別為第二節中所講述的五種資料型別 整型 浮點型 字元型 指標型和無值型 構成結構的每乙個型別變數稱為...