c語言聯合作用,c語言聯合有什麼用

本文目錄一覽:

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-tw/n/190223.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-29 17:11
下一篇 2024-11-29 22:32

相關推薦

  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • Python中init方法的作用及使用方法

    Python中的init方法是一個類的構造函數,在創建對象時被調用。在本篇文章中,我們將從多個方面詳細討論init方法的作用,使用方法以及注意點。 一、定義init方法 在Pyth…

    編程 2025-04-29
  • 為什麼用cmd運行Java時需要在文件內打開cmd為中心

    在Java開發中,我們經常會使用cmd在命令行窗口運行程序。然而,有時候我們會發現,在運行Java程序時,需要在文件內打開cmd為中心,這讓很多開發者感到疑惑,那麼,為什麼會出現這…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28

發表回復

登錄後才能評論