欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言關(guān)鍵字union的定義和使用詳解

 更新時間:2021年02月08日 11:34:29   作者:沐歌愛編程  
這篇文章主要介紹了C語言關(guān)鍵字union的定義和使用詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

union,中文名“聯(lián)合體、共用體”,在某種程度上類似結(jié)構(gòu)體struct的一種數(shù)據(jù)結(jié)構(gòu),共用體(union)和結(jié)構(gòu)體(struct)同樣可以包含很多種數(shù)據(jù)類型和變量。

但在“聯(lián)合”中, 各成員共享一段內(nèi)存空間, 一個聯(lián)合變量的長度等于各成員中最長的長度 。一個聯(lián)合體類型必須經(jīng)過定義之后, 才能使用它,才能把一個變量聲明定義為該聯(lián)合體類型。

當(dāng)定義結(jié)構(gòu)對象時,如果沒有顯式地初始化它們,則會采用一般初始化規(guī)則:如果該結(jié)構(gòu)對象屬于動態(tài)存儲類型,那么其成員具有不確定的初始值。

另一方面,如果結(jié)構(gòu)對象具有靜態(tài)存儲周期,那么其非指針成員初始值是 0,其指針成員初始值是空指針。

不同于結(jié)構(gòu)成員——它們在結(jié)構(gòu)中都具有單獨的內(nèi)存位置,聯(lián)合成員則共享同一個內(nèi)存位置。也就是說,聯(lián)合中的所有成員都是從相同的內(nèi)存地址開始。因此,可以定義一個擁有許多成員的聯(lián)合,但是同一時刻只能有一個成員允許含有一個值。聯(lián)合讓程序員可以方便地通過不同方式使用同一個內(nèi)存位置。

一、定義聯(lián)合(union)

聯(lián)合的定義方式與結(jié)構(gòu)是一樣的,只是把關(guān)鍵字 struct 改成 union:

union [標(biāo)簽名稱]{成員聲明列表};

下面的例子定義了一個名為Data的聯(lián)合類型,它有 3 個成員:i、x 和 str:

union Data { int i;double x;char str [16];};

這種類型的對象可以存儲一個整數(shù)、一個浮點數(shù)或一個短字符串。

例如:

union StateMachine

{

  char character;

  int number;

  char *str;

  double exp;

};

一個union 只配置一個足夠大的空間以來容納最大長度的數(shù)據(jù)成員,以上例而言,最大長度是double 型態(tài),所以StateMachine 的空間大小就是double 數(shù)據(jù)類型的大小。

在C++里,union 的成員默認(rèn)屬性頁為public。union 主要用來壓縮空間。如果一些數(shù)據(jù)不可能在同一時間同時被用到,則可以使用union。

二、初始化聯(lián)合(union)

與結(jié)構(gòu)類似,通過初始化列表(initialization list)來初始化聯(lián)合對象。但是,對聯(lián)合來說,列表只有一個初始化器(initializer)。

與結(jié)構(gòu)一樣,C99 允許在初始化器中使用成員指示符來指示哪個成員被初始化。而且,如果初始化器沒有成員指示符,那么就與聯(lián)合內(nèi)的第一個成員關(guān)聯(lián)。具有自動存儲類的聯(lián)合對象也可以使用已有的同類型對象來初始化。下面是一些初始化例子:

union Data var1={77},

var2={.str="Mary"},

var3=var1,

myData[100]={{.x=0.5},{1},var2};

數(shù)組 myData 中的元素如果沒有指定初始化器,會被隱式地初始化為 0 值。

三、聯(lián)合體變量的聲明

聯(lián)合變量的說明和結(jié)構(gòu)變量的聲明方式相同, 也有三種形式:

 第一種 , 先定義聯(lián)合體類型,再聲明聯(lián)合體變量 ;

 第二種 ,定義聯(lián)合體類型的同時聲明聯(lián)合體變量;

 第三種 ,直接聲明聯(lián)合體(以匿名的形式定義聯(lián)合體類型)。

以perdata類型為例,說明如下:

第一種, 先定義聯(lián)合體類型,再聲明聯(lián)合體變量

union  perdata

{

  int class;

  char officae[10];

};

union  perdata a,b; /*說明a,b為perdata類型*/

第二種, 定義聯(lián)合體類型的同時聲明聯(lián)合體變量:

union perdata

{

int class;

char office[10];

} a , b ;

第三種, 直接聲明聯(lián)合體(以匿名的形式定義聯(lián)合體類型):

union

{

int class;

char office[10];

}a,b

經(jīng)說明后的a,b變量均為perdata類型。a,b變量的長度應(yīng)等于 perdata 的成員中最長的長度, 即等于office數(shù)組的長度,共10個字節(jié)。對a,b變量如賦予整型值時,只使用了2個字節(jié),而賦予字符數(shù)組時,可用10個字節(jié)。

四、聯(lián)合體變量的賦值和使用

對聯(lián)合體變量的賦值,使用都只能是對變量的成員進(jìn)行。

聯(lián)合變量的成員表示為:  聯(lián)合變量名 . 成員名 

例如,a被說明為perdata類型的變量之后,可使用 a.class,a.office

不允許只用聯(lián)合變量名作賦值或其它操作。 也不允許對聯(lián)合變量作初始化賦值,賦值只能在程序中進(jìn)行。

一個聯(lián)合體變量, 每次只能賦予一個成員值。一個聯(lián)合變量的值就是聯(lián)合變員的某一個成員值。

五、struct和union和區(qū)別

1.結(jié)構(gòu)和聯(lián)合都是由多個不同的數(shù)據(jù)類型成員組成的,但是在任一時刻聯(lián)合只存放一個被選中的成員,而結(jié)構(gòu)的所有成員都存在。

2。對于聯(lián)合的不同成員賦值,將會對其他成員重寫,原來成員的值就不存在了,而對結(jié)構(gòu)的不同成員賦值是會不影響的。

對聯(lián)合變量的賦值,都只能對變量的成員進(jìn)行,一個聯(lián)合變量每次只能賦值給一個成員,一個聯(lián)合變量的值就是當(dāng)前聯(lián)合變量的某一個成員值。

應(yīng)該說明的是, 這里所謂的共享不是指把多個成員同時裝入一個聯(lián)合變量內(nèi), 而是指該聯(lián)合變量可被賦予任一成員值,但每次只能賦一種值, 賦入新值則沖去舊值。

到此這篇關(guān)于C語言關(guān)鍵字union的定義和使用詳解的文章就介紹到這了,更多相關(guān)C語言 union關(guān)鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言?sizeof關(guān)鍵字的具體使用

    C語言?sizeof關(guān)鍵字的具體使用

    在C語言中,sizeof是一個非常常用的關(guān)鍵字,本文主要介紹了C語言?sizeof關(guān)鍵字的具體使用,包括sizeof 關(guān)鍵字的語法、用法、特點和注意事項,感興趣的可以了解一下
    2024-02-02
  • 淺析C語言中sscanf 的用法

    淺析C語言中sscanf 的用法

    以下是對C語言中sscanf函數(shù)的使用方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-07-07
  • 詳解C語言之堆棧

    詳解C語言之堆棧

    這篇文章主要為大家介紹了C語言的堆棧,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • 基于c++強制類型轉(zhuǎn)換的(總結(jié))詳解

    基于c++強制類型轉(zhuǎn)換的(總結(jié))詳解

    本篇文章對C++中的強制類型轉(zhuǎn)換進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • C++中引用處理的基本方法

    C++中引用處理的基本方法

    引用不是新定義了一個變量,而是給已經(jīng)存在的變量取了一個別名,編譯器不會為引用變量開辟內(nèi)存空間,他和他引用的變量共用一塊內(nèi)存空間,下面這篇文章主要給大家介紹了關(guān)于C++中引用處理的基本方法,需要的朋友可以參考下
    2022-12-12
  • C語言編程數(shù)據(jù)結(jié)構(gòu)棧與隊列的全面講解示例教程

    C語言編程數(shù)據(jù)結(jié)構(gòu)棧與隊列的全面講解示例教程

    本文介紹著重介紹數(shù)據(jù)結(jié)構(gòu)-棧和隊列的知識,由于本文也設(shè)計多個動態(tài)內(nèi)存開辟函數(shù),小伙伴們在學(xué)習(xí)本文之前,一定一定一定要把動態(tài)內(nèi)存開辟相關(guān)知識掌握牢固,這樣學(xué)習(xí)起本文才能事半功倍
    2021-10-10
  • C語言實現(xiàn)出棧序列合法性判定

    C語言實現(xiàn)出棧序列合法性判定

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)出棧序列合法性判定,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C++ 中Vector常用基本操作

    C++ 中Vector常用基本操作

    標(biāo)準(zhǔn)庫vector類型是C++中使用較多的一種類模板,本文給大家分享C++ 中Vector常用基本操作,感興趣的朋友一起看看吧
    2017-10-10
  • C語言堆實現(xiàn)建堆算法和堆排序

    C語言堆實現(xiàn)建堆算法和堆排序

    本文主要介紹了C語言堆實現(xiàn)建堆算法和堆排序,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • C++命名空間和缺省參數(shù)介紹

    C++命名空間和缺省參數(shù)介紹

    這篇文章主要介紹了C++命名空間和缺省參數(shù),使用命名空間的目的是對標(biāo)識符的名稱進(jìn)行本地化,以避免命名沖突或名字污染,namespace關(guān)鍵字的出現(xiàn)就是針對這種問題的,缺省參數(shù)是聲明或定義函數(shù)時為函數(shù)的參數(shù)指定一個默認(rèn)值,更多詳細(xì)內(nèi)容需要的小伙伴可以參考下面文章內(nèi)容
    2022-01-01

最新評論