c語言中聯(lián)合體和枚舉用法詳解
一、聯(lián)合體
(1) 像結構體?樣,聯(lián)合體也是由一個或者多個成員構成,這些成員可以不同的類型。
(2)但是編譯器只為最大的成員分配足夠的內存空間。聯(lián)合體的特點是所有成員共用同一塊內存空間。所以聯(lián)合體也叫:共用體。
(3) 給聯(lián)合體其中?個成員賦值,其他成員的值也跟著變化。
1. 聯(lián)合體類型的聲明和創(chuàng)建
關鍵字:union
聲明:
#include <stdio.h>
//聯(lián)合類型的聲明
union Un// 類型名
{
char c;//成員
int i;
};
int main()
{
union Un s = {0};//創(chuàng)建
return 0;
}
2. 聯(lián)合體的特點
聯(lián)合的成員是共用同?塊內存空間的,這樣?個聯(lián)合變量的大小,至少是最大成員的大?。ㄒ驗槁?lián)合至少得有能力保存最大的那個成員)。
//代碼1
#include <stdio.h>
//聯(lián)合類型的聲明
union Un
{
char c;
int i;
};
int main()
{
//聯(lián)合變量的定義
union Un un = {0};
// 下?輸出的結果是?樣的嗎?
printf("%p\n", &(un.i));
printf("%p\n", &(un.c));
printf("%p\n", &un);
return 0;
}
運行結果:

它們的地址都是一樣的,說明它們共用一塊空間
我們再來舉一個例子
union Un
{
char c;
int i;
};
int main()
{
//聯(lián)合變量的定義
union Un un = { 0 };
un.i = 0x11223344;
printf("%x\n", un.i);
un.c = 0x55;
printf("%x\n", un.i);
return 0;
}
運行結果:

為什么結果不一樣呢?
是因為它們共用一塊空間,當 c 使用時就會改變 i 的值
內存布局:

3. 聯(lián)合體大小的計算
聯(lián)合的大小至少是最大成員的大小。
當最大成員大小不是最大對齊數(shù)的整數(shù)倍的時候,就要對齊到最大對齊數(shù)的整數(shù)倍。
如:
#include <stdio.h>
union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
int main()
{
//下?輸出的結果是什么?
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));
return 0;
}
運行結果:

當遇到數(shù)組是我們只看類型如char c[5];->我們只看char的對齊數(shù),char的對齊數(shù)為1
第一個輸出結果
該類型的最大對齊數(shù)為4(int)
數(shù)組的大小為7,我們要保證它的大小,只能是最大對齊數(shù)的倍數(shù),所以是8
第二個輸出結果同理
4.總結
(1)使用聯(lián)合體是可以節(jié)省空間的
(2)使用聯(lián)合體的一個成員時就不要使用其他成員(因為其他成員的值會發(fā)生變化)
二、枚舉
1. 枚舉類型的聲明
關鍵字:enum
枚舉顧名思義就是??列舉。
把可能的取值??列舉。
比如我們現(xiàn)實生活中: ?周的星期?到星期日是有限的7天,可以??列舉
性別有:男、女、保密,也可以??列舉
月份有12個月,也可以??列舉
三原色,也是可以意義列舉 這些數(shù)據(jù)的表示就可以使用枚舉了。
如:
enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Sex//性別
{
MALE,
FEMALE,
SECRET
};
enum Color//顏?
{
RED,
GREEN,
BLUE
};
以上定義的 enum Day , enum Sex , enum Color 都是枚舉類型。
{}中的內容是枚舉類型的可能取值,也叫 枚舉常量 。
這些可能取值都是有值的,默認從0開始,依次遞增1,當然在聲明枚舉類型的時候也可以賦初值。
如:
enum Color//顏?
{
RED=2,
GREEN=4,
BLUE=8
};
2. 枚舉類型的優(yōu)點
為什么使用枚舉? 我們可以使用 #define 定義常量,為什么非要使用枚舉? 枚舉的優(yōu)點:
增加代碼的可讀性和可維護性
和#define定義的標識符?較枚舉有類型檢查,更加嚴謹。
便于調試,預處理階段會刪除 #define 定義的符號
使用方便,?次可以定義多個常量
枚舉常量是遵循作用域規(guī)則的,枚舉聲明在函數(shù)內,只能在函數(shù)內使用
3. 枚舉類型的使用
enum Color//顏?
{
RED=1,
GREEN=2,
BLUE=4
};
enum Color clr = GREEN;//使?枚舉常量給枚舉變量賦值
那是否可以拿整數(shù)給枚舉變量賦值呢?在C語言中是可以的,但是在C++是不?的,C++的類型檢查比較嚴格。
總結
到此這篇關于c語言中聯(lián)合體和枚舉用法詳解的文章就介紹到這了,更多相關c語言聯(lián)合體和枚舉內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C語言常用庫函數(shù)的使用及模擬實現(xiàn)詳解例舉
C語言庫函數(shù)是把自定義函數(shù)放到庫里,是別人把一些常用到的函數(shù)編完放到一個文件里,供程序員使用,下面讓我們一起來詳細了解它2022-04-04

