union聯合 資料型別 詳細說明

2021-06-09 23:39:15 字數 2559 閱讀 8510

union(聯合)與struct(結構)有一些相似之處。但兩者有本質上的不同。在struct中各成員有各自的記憶體空間, 乙個struct變數的總長度是各成員長度之和。而在union中,各成員共享一段記憶體空間, 乙個union變數的長度等於各成員中最長的長度。應該說明的是, 這裡所謂的共享不是指把多個成員同時裝入乙個union變數內, 而是指該union變數可被賦予任一成員值,但每次只能賦一種值, 賦入新值則衝去舊值。如前面介紹的「單位」變數, 如定義為乙個可裝入「班級」或「教研室」的union後,就允許賦予整型值(班級)或字串(教研室)。要麼賦予整型值,要麼賦予字串,不能把兩者同時賦予它。union型別的定義和變數的說明乙個union型別必須經過定義之後, 才能把變數說明為該union型別。

一、聯合變數的宣告

聯合變數的宣告和結構變數的宣告方式相同, 也有三種形式。即先定義,再說明; 定義同時宣告和直接宣告。以上面例子中的perdata型別為例,宣告如下: 

union perdata

;  //和struct 和class一樣都有分號

union perdata a,b; (若為union perdata *a,*b;則後面的運算子要用『->』,而不是『.』)

或者可同時宣告為: 

union perdata

a,b;

或直接宣告為: 

union

a,b 

經說宣告的a,b變數均為perdata型別。 a,b變數的長度應等於 perdata 的成員中最長的長度, 即等於

office陣列的長度,共10個位元組。若a,b變數如賦予整型值時,只使用了2個位元組,而賦予字元陣列時,可用10個位元組。

聯合變數的賦值和使用

對聯合變數的賦值,使用都只能是對變數的成員進行。 聯合變數的成員表示為: 聯合變數名.成員名

例如,a被說明為perdata型別的變數之後,可使用 a.class a.office 不允許只用聯合變數名作賦值或其它操作。也不允許對聯合變數作初始化賦值,賦值只能在程式中進行,對於乙個union的變數, 每次只能賦予乙個成員值,也可以說,乙個聯合變數的值就是聯合變員的某乙個成員值。

二:【例項 1 】:

設有乙個教師與學生通用的**,教師資料有姓名,年齡,職業,教研室四項。學生有姓名,年齡,職業,班級四項。程式設計輸入人員資料, 再以**輸出。

#include

main()

depa;

}body[2];

int n,i;

for(i=0;i<2;i++)

printf("name\tage job class/office\n");

for(i=0;i<2;i++) }

該程式說明:

本例程式用乙個結構陣列body來存放人員資料, 該結構共有四個成員。其中成員項depa是乙個聯合型別, 這個聯合又由兩個成員組成,乙個為整型量class,乙個為字元陣列office。在程式的第乙個for語句中,輸入人員的各項資料,先輸入結構的前三個成員name,age和job,然後判別job成員項,如為"s"則對聯合depa·class輸入(對學生賦班級編號)否則對depa·office輸入(對教師賦教研組名)。

在用scanf語句輸入時要注意,凡為陣列型別的成員,無論是結構成員還是聯合成員,在該項前不能再加"&"運算子。如程式第18行中

body[i].name是乙個陣列型別,第22行中的body[i].depa.office也是陣列型別,因此在這兩項之間不能加"&"運算子。程式中的第二個for語句用於輸出各成員項的值

【例項 2】:

#include

union myun

u;int k;

}a;int main()

程式說明:union型別是共享記憶體的,以size最大的結構作為自己的大小

,這樣的話,myun這個結構就包含u這個結構體,而大小也等於u這個結構體的大小,在記憶體中的排列為生命的順序x,y,z從低到高,然後賦值的時候,在記憶體中,就是x的位置放置4,y的位置放置5,z的位置放置6,現在對k賦值,對k的賦值因為是union,要共享記憶體,所以從union的首位址開始放置,首位址開始的位置其實是x的位置,這樣原來記憶體中x的位置就被k所賦的值代替了,就變為0了,這個時候要進行列印,就直接看記憶體裡就行了,x的位置也就是k的位置是0,而y,z的位置的值沒有改變,所以應該是0,5,6 小結

1. struct(結構)和union(聯合)是兩種構造型別資料,是使用者定義新資料型別的重要手段。結構和聯合有很多的相似之處,它們都由成員組成。成員可以具有不同的資料型別。成員的表示方法相同。都可用三種方式作變數說明。

2. 在結構中,各成員都占有自己的記憶體空間,它們是同時存在的。乙個結構變數的總長度等於所有成員長度之和。在聯合中,所有成員不能同時占用它的記憶體空間,它們不能同時存在。聯合變數的長度等於最長的成員的長度。

3. 「.」是成員運算子,可用它表示成員項,成員還可用「->」運算子來表示。

4. 結構變數可以作為函式引數,函式也可返回指向結構的指標變數。而聯合變數不能作為函式引數,函式也不能返回指向聯合的指標變數。但可以使用指向聯合變數的指標,也可使用聯合陣列。

5. 結構定義允許巢狀,結構中也可用聯合作為成員,形成結構和聯合的巢狀。

注意:union中不能包含有建構函式/析構函式/拷貝建構函式/賦值運算子/虛函式的類成員變數

Hadoop HDFS資料流詳細說明

服務端啟動hdfs中的nn和dn程序 客戶端建立乙個分布式檔案系統客戶端,由客戶端向nn傳送請求,請求上傳檔案 nn處理請求,檢查客戶端是否有許可權上傳,路徑是否合法等 檢查通過,nn響應客戶端可以上傳 客戶端根據自己設定的塊大小,開始上傳第乙個塊,預設0 128m,nn根據客戶端上傳檔案的副本數 ...

復合資料型別

復合資料型別 作用 封裝資料 多種不同型別資料存放在一起 應存放在全域性,在訪問結構體中的變數時,應用stu.id stu.name 初始化的方式 在對陣列進行初始化時 strcpy stu.name,zhangsan 在對指標進行初始化時 char name 對name進行初始化 stu.name...

復合資料型別

一 struct結構體 封裝資料 存放多種不同的資料型別 struct的宣告放在全域性區 1.宣告和定義 宣告 struct student struct student stu array 3 int i for i 0 i 3 i for i 0 i 3 i include struct stu...