共用體詳解

2021-10-09 14:43:04 字數 2328 閱讀 8911

4.總結

在進行某些演算法的c語言程式設計的時候,需要使幾種不同型別的變數存放到同一段記憶體單元中。也就是使用覆蓋技術,幾個變數互相覆蓋。這種幾個不同的變數共同占用一段記憶體的結構,在c語言中,被稱作「共用體」型別結構,簡稱共用體,也叫聯合體。

定義共用體型別變數的一般形式為:

union 共用體名

變數表列;

例如:

union data

a, b, c; //變數

在位址空間中表示如下圖:

以上3個變數在記憶體中佔的位元組數不同,但都是從同一位址開始(圖中設為1000)存放,也就是使用覆蓋技術,後乙個資料覆蓋了前面的資料。

共用體型別資料的特點:

(1)同一記憶體段可以用來存放幾種不同型別的成員,但在每一瞬間只能存放其中乙個成員,而不是同時存放幾個。

union data

a, b, c;

//變數

a.i =

97;

表示將整數97存放在共用體變數中,輸出結果如下。

97換成16進製為0x00000061,又因為電腦的儲存方式為小端格式,所以在位址中存在的方式如下圖

因為float的儲存方式不同,解碼時會按照獨自的方式計算解碼(可自行搜尋float型別資料在記憶體中的儲存方式),所以輸出為0.00000。

當a.f = 0x61;時,輸出入下圖:(列印a.ch時,因為0x0不能用字元列印,所以用的整型,效果一樣)

儲存方式為:

所以float型別97儲存的十六進製制為0x42c20000。

(2)可以對共用體變數初始化,但初始化表中只能有乙個常量。

union data

a =;

//不能初始化3個成員,他們占用同一段儲存單元

union data a =

;//正確,對第乙個成員初始化

union data a =

;//c99允許對指定的乙個成員初始化

(3)共用體變數中起作用的成員是最後一次被賦值的成員,在對共同體變數中的乙個成員賦值後,原有變數儲存單元中的值就被取代。

(5)共用體型別可以出現結構體型別定義中,也可以定義共用體陣列。結構體中也可以出現在共用體型別定義中,陣列也可以作為共用體成員。

共用體變數不能直接引用。

改變共用體中的乙個成員,就會改變整個共用體。

共用體在任意乙個時刻,只有乙個成員有意義。並且,對共用體變數賦值,在任意乙個時刻只能對乙個變數賦值。

共用體的大小就是最寬基本成員大小,但是要整除最寬基本成員大小。

這乙個小點十分重要,而且十分容易出錯。

例如:

大家先看下這個結果是多少?

是13嗎?

共用體的大小就是最寬基本成員大小,這句話是不完整的,後面還有一句,那就是要整除最寬基本資料型別。

答案是16.

共用體其實相對於結構體來說是很簡單的,你可以把共用體想象成乙個多面手,定義乙個共用體變數,它可以用於多種用途,時而是整型,時而是浮點型資料。給人一種高深莫測的感覺,但是,要小心,一旦你對某個成員進行了修改,那麼整個共用體都會收到影響。

共用體詳解

共用體同結構體的定義形式上相同,只是把關鍵字struct改為union。有時需要把幾種不同型別的變數放在同有一記憶體區域中,見圖12 6,把乙個整型變數,乙個字元變數,乙個實型變數放在同一記憶體區域中,儘管三個變數占用位元組數各不相同,但起始位址都一樣 例如1000 它要用 覆蓋 技術,使多個變數互...

結構體 共用體

結構體 結構體的定義1 struct mystruct 定義新變數 struct mystruct s1 結構體定義2 typedef struct mystruct mstrct 定義新變數 mstrct s1 結構體定義3 type struct mstrct 定義新變數 mstrct s1 共...

共用體練習

給定n和m,接下來有n個描述,每個描述包含乙個型別標誌和一組相應的資料。型別標誌共3種 int double string,然後對應一組相應的資料。緊接著有m個詢問,每個詢問僅包含乙個整數x,要求輸出第x個描述對應的資料 string型別保證不含空格,每組對應string資料不會超過19個字元 輸入...