本文目錄一覽:
- 1、C語言中聯合的主要作用是什麼
- 2、C語言中的聯合又叫什麼?
- 3、c語言,union有什麼用?
- 4、C語言中聯合體(union)的使用
- 5、在c語言中,共用體一般有什麼作用?
- 6、C語言結構、聯合和枚舉(struct、union、enum)
C語言中聯合的主要作用是什麼
這個就是為了提供程序的可讀性的,代表的其實就是數字,比如一周有7天,
enum
day
{
monday,
tues
……
}
當然,你也可以用1,2,3,5這樣的數字來直接表示,但是可讀性就很差了,別人讀你的代碼就讀不懂了。
C語言中的聯合又叫什麼?
c語言的聯合(union)介紹 「聯合」與「結構」有一些相似之處。但兩者有本質上的不同。在結構中各成員有各自的內存空間, 一個結構變量的總長度是各成員長度之和。而在「聯合」中,各成員共享一段內存空間, 一個聯合變量的長度等於各成員中最長的長度。應該說明的是, 這裡所謂的共享不是指把多個成員同時裝入一個聯合變量內, 而是指該聯合變量可被賦予任一成員值,但每次只能賦一種值, 賦入新值則衝去舊值。如前面介紹的「單位」變量, 如定義為一個可裝入「班級」或「教研室」的聯合後,就允許賦予整型值(班級)或字符串(教研室)。要麼賦予整型值,要麼賦予字符串,不能把兩者同時賦予它。聯合類型的定義和聯合變量的說明一個聯合類型必須經過定義之後, 才能把變量說明為該聯合類型。 一、聯合的定義 定義一個聯合類型的一般形式為: union 聯合名 { 成員表 }; 成員表中含有若干成員,成員的一般形式為: 類型說明符 成員名 成員名的命名應符合標識符的規定。 例如: union perdata { int class; char office; }; 定義了一個名為perdata的聯合類型,它含有兩個成員,一個為整型,成員名為class;另一個為字符數組,數組名為office。聯合定義之後,即可進行聯合變量說明,被說明為perdata類型的變量,可以存放整型量class或存放字符數組office。 二、聯合變量的說明 聯合變量的說明和結構變量的說明方式相同, 也有三種形式。即先定義,再說明;定義同時說明和直接說明。以perdata類型為例,說明如下: union perdata { int class; char officae; }; union perdata a,b; /*說明a,b為perdata類型*/ 或者可同時說明為: union perdata { int class; char office; }a,b; 或直接說明為: union { int class; char office; }a,b 經說明後的a,b變量均為perdata類型。 它們的內存分配示意圖如圖7—8所示。a,b變量的長度應等於 perdata 的成員中最長的長度, 即等於 office數組的長度,共10個位元組。從圖中可見,a,b變量如賦予整型值時,只使用了2個位元組,而賦予字符數組時,可用10個位元組。 聯合變量的賦值和使用 對聯合變量的賦值,使用都只能是對變量的成員進行。 聯合變量的成員表示為: 聯合變量名.成員名 例如,a被說明為perdata類型的變量之後,可使用 a.class a.office 不允許只用聯合變量名作賦值或其它操作。 也不允許對聯合變量作初始化賦值,賦值只能在程序中進行?掛 僨康魎得韉氖?一個聯合變量, 每次只能賦予一個成員值?瘓浠八?一個聯合變量的值就是聯合變員的某一個成員值。 [例7.15]設有一個教師與學生通用的表格,教師數據有姓名,年齡,職業,教研室四項。學生有姓名,年齡,職業,班級四項。 編程輸入人員數據, 再以表格輸出。 [code:1:8d8ee8c82c] main() { struct { char name[10]; int age; char job; union { int class; char office[10]; } depa; }body[2]; int n,i; for(i=0;i2;i++) { printf(“input name,age,job and department\n”); scanf(“%s %d %c”,body[i].name,body[i].age,body[i].job); if(body[i].job==’s’) scanf(“%d”,body[i].depa.class); else scanf(“%s”,body[i].depa.office); } printf(“name\tage job class/office\n”); for(i=0;i2;i++) { if(body[i].job==’s’) printf(“%s\t%3d %3c %d\n”,body[i].name,body[i].age ,body[i].job,body[i].depa.class); else printf(“%s\t%3d %3c %s\n”,body[i].name,body[i].age, body[i].job,body[i].depa.office); } } [/code:1:8d8ee8c82c] 本例程序用一個結構數組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語句用於輸出各成員項的值: 本章小結 1. 結構和聯合是兩種構造類型數據,是用戶定義新數據類型的重要手段。結構和聯合有很多的相似之處,它們都由成員組成。成員可以具有不同的數據類型。成員的表示方法相同。都可用三種方式作變量說明。 2. 在結構中,各成員都佔有自己的內存空間,它們是同時存在的。一個結構變量的總長度等於所有成員長度之和。在聯合中,所有成員不能同時佔用它的內存空間,它們不能同時存在。聯合變量的長度等於最長的成員的長度。 3. 「.」是成員運算符,可用它表示成員項,成員還可用「-」運算符來表示。 4. 結構變量可以作為函數參數,函數也可返回指向結構的指針變量。而聯合變量不能作為函數參數,函數也不能返回指向聯合的指針變量。但可以使用指向聯合變量的指針,也可使用聯合數組。 5. 結構定義允許嵌套,結構中也可用聯合作為成員,形成結構和聯合的嵌套。 6. 鏈表是一種重要的數據結構,它便於實現動態的存儲分配。本章介紹是單向鏈表,還可組成雙向鏈表,循環鏈表等。
c語言,union有什麼用?
本質上來說和結構體是一樣的,但是從包裝的角度來看有差異。
1、union中可以定義多個成員,union的大小由最大的成員的大小決定。
2、union成員共享同一塊大小的內存,一次只能使用其中的一個成員。
3、對某一個成員賦值,會覆蓋其他成員的值(也不奇怪,因為他們共享一塊內存。但前提是成員所佔位元組數相同,當成員所佔位元組數不同時只會覆蓋相應位元組上的值,比如對char成員賦值就不會把整個int成員覆蓋掉,因為char只佔一個位元組,而int佔四個位元組)
4、聯合體union的存放順序是所有成員都從低地址開始存放的。
下面看一個簡單的代碼:
#include stdio.h
typedef union{
char c;
int a;
int b;
}Demo;
int main(int argc, char **argv)
{
Demo d;
d.c = ‘H’;
d.a = 10;
d.b = 12;
printf(“size: %d\n”, sizeof(d));
printf(“%c\t%d\t%d\n”, d.c, d.a, d.b);
return 0;
}
具體用法舉例:
1. 為了方便看懂代碼。
比如說想寫一個3 * 3的矩陣,可以這樣寫:
struct Matrix
{
union
{
struct
{
float _f11, _f12, _f13, _f21, _f22, _f23, _f31, _f32, _f33;
};
float f[3][3];
}_matrix;
};
struct Matrix m;
這兩個東西共同使用相同的空間,所以沒有空間浪費,在需要整體用矩陣的時候可以用
m._matrix.f (比如說傳參,或者是整體賦值等);需要用其中的幾個元素的時候可以用m._matrix._f11那樣可以避免用m.f[0][0](這樣不大直觀,而且容易出錯)。
2. 用在強制類型轉換上(比強制類型轉換更加容易看懂)
下面舉幾個例子:
(1). 判斷系統用的是big endian 還是 little endian(其定義大家可以到網上查相關資料,此略)
#define TRUE 1
#define FALSE 0
#define BOOL int
BOOL isBigEndian()
{
int i = 1; /* i = 0x00000001*/
char c = *(char *)i; /* 注意不能寫成 char c = (char)i; */
return (int )c != i;
}
如果是little endian位元組序的話,那個i = 1;的內存從小到大依次放的是:0x01 0x00 0x00 0x00,如是,按照i的起始地址變成按照char *方式(1位元組)存取,即得c = 0x01;
反之亦然
也許看起來不是很清晰,下面來看一下這個:
BOOL isBigEndian()
{
union
{
int i;
char c;
}test;
test.c = 2;
return test.i != 2;
}
這裡用的是union來控制這個共享布局,有個知識點就是union裏面的成員c和i都是從低地址開始對齊的。同樣可以得到如此結果,而且不用轉換,清晰一些。
什麼,不覺得清晰??那再看下面的例子:
(2). 將little endian下的long long類型的值換成 big endian類型的值。已經知道系統提供了下面的api:long htonl(long lg);作用是把所有的位元組序換成大端位元組序。因此得出下面做法:
long long htonLL(long long lg)
{
union
{
struct
{
long low;
long high;
}val_1;
long long val_2;
}val_arg, val_ret;
if ( isBigEndian() )
return lg;
val_arg.val_2 = lg;
val_ret.val_1.low = htonl( val_arg.val_1.high );
val_ret.val_1.high = htonl( val_arg.val_1.low );
return val_ret.val_2;
}
只要把內存結構的草圖畫出來就比較容易明白了。
(3).為了理解c++類的布局,再看下面一個例子。有如下類:
class Test
{
public :
float getFVal(){ return f;}
private :
int i;
char c;
float f;
};
Test t;
不能在類Test中增加代碼,給對象中的f賦值7.0f.
class Test_Cpy
{
public :
float getVal(){ return f;}
float setVal(float f){ this -f = f;}
private :
int i;
char c;
float f;
};
….
int main()
{
Test t;
union
{
Test t1,
Test_Cpy t2;
}test;
test.t2.setVal(7.0f);
t = test.t1;
assert( t.getVal() == 7.0f );
return 0;
}
說明:因為在增加類的成員函數時候,那個類的對象的布局基本不變。因此可以寫一個與Test類一樣結構的類Test_Cpy,而多了一個成員函數setVal,再用uinon結構對齊,就可以給私有變量賦值了。(這種方法在有虛機類和虛函數機制時可能失靈,故不可移植)至於詳細的討論,網上有,這個例子在實際中沒有用途,只是用來考察這個內存布局的使用而已.
union在操作系統底層的代碼中用的比較多,因為它在內存共賞布局上方便且直觀。所以網絡編程,協議分析,內核代碼上有一些用到union都比較好懂,簡化了設計。
C語言中聯合體(union)的使用
聯合體又被稱為共用體,我個人感覺,共用體名字更合理。
和結構體同屬於C語言數據類型中的結構類型。
例如
uniuon data{ int i ; char c ;float f;}x;定義共用體類型名稱為data類型,有三個屬性,分別為
int i ; char c ;float f;這三個屬性共同佔用內存空間,所以空間佔用選屬性中佔用最多的那個,也就是float f。佔用四個位元組。由於共同佔用,所以在同一時間只能保留一個屬性內容
如果為
struct data{ int i ; char c ;float f;}x;則表明定義結構體類型名稱為data類型,也是三個屬性,不過在內存中佔用的是空間大小是三個屬性之和。若int類型在編譯器中分配4位元組的話,總共分配位元組數位4+1+4總共9位元組。
由於單獨佔用,所以在同一時間可以保留所有屬性內容
在c語言中,共用體一般有什麼作用?
共用體一般指聯合體,作用如下:
1、節省內存
有兩個很長的數據結構,不會同時使用,用結構體的話,只佔用最長的那個數據結構所佔用的空間,就足夠了。
2、做某些轉換用
union{char a[8];double x;};
x=20.8;
couthexa[0]「 」a[1]…endl;
擴展資料:
結構體和共用體
結構體和共用體的區別在於:結構體的各個成員會佔用不同的內存,互相之間沒有影響;而共用體的所有成員佔用同一段內存,修改一個成員會影響其餘所有成員。
結構體佔用的內存大於等於所有成員佔用的內存的總和(成員之間可能會存在縫隙),共用體佔用的內存等於最長的成員佔用的內存。
共用體使用了內存覆蓋技術,同一時刻只能保存一個成員的值,如果對新的成員賦值,就會把原來成員的值覆蓋掉。
共用體也是一種自定義類型,可以通過它來創建變量,
參考資料來源:百度百科-共用體
C語言結構、聯合和枚舉(struct、union、enum)
@[TOC]
結構:具有不同數據類型的值(成員)的集合。
聯合跟結構很類似,不同在於聯合的成員共享同一存儲空間。
結構成員通過名字而不是位置訪問(與數組的區別)
指定初始化:不需要與結構成員的順序一致
結構的賦值: part2 = part1 ,直接賦值(與數組不同)
不能用==和!=判斷結構是否相等
命名結構時,兩種寫法都可以,但是 結構用於鏈表時,必須使用結構標記。
結構裏面也允許嵌套結構。
編譯器只為最大的成員分配足夠的內存空間
結構變量的成員存儲在 不同 的內存地址中,聯合的成員存儲在 同一 內存地址中。
聯合的作用:用聯合來節省空間
構造混合的數據結構
每次對聯合的成員賦值,都由程序負責改變標記字段的內容
許多程序中,我們只具有少量有意義的值。
我們為這種具有少量可能值的變量提供了一種專用類型——枚舉。
區別:枚舉常量的名字必須不同於 作用於範圍內 聲明的其他標識符。
枚舉常量遵循C語言的作用域規則:如果枚舉聲明在函數體內,那麼它的常量對外部函數來說是不可見的。
默認情況下,編譯器會把整數0,1,2……賦值給特定枚舉中的變量
如果想要指定變量的值,可以在聲明時指定。
當沒有為枚舉常量指定值時,它的值比前面一個值大1.
C語言允許把枚舉常量和普通整數混合。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/190223.html