C語言中枚舉與聯(lián)合體的使用方法(enum union)
enum的定義
枚舉顧名思義就是一一列舉,把可能的取值一一列舉。
枚舉的使用方式
//定義一個枚舉Color的類型
enum Color // enum Color 是一個類型
{
RED, //逗號結(jié)尾
GREEN,
BLUE // 最后一個成員沒有逗號沒有分號
};
int main()
{
printf("%d",RED);//0
printf("%d",GREEN);//1
printf("%d",BLUE);//2
return 0;
}
{}中的內(nèi)容是枚舉類型的可能取值,也叫 枚舉常量 。 這些可能取值都是有值的,默認從0開始,一次遞增1,當然在定義的時候也可以賦初值。從賦值的地方開始,后面的枚舉常量沒賦值的話,也是從最后一次枚舉常量賦值的地方賦值地方開始依次遞增1數(shù)值
enum Color//顏色
{
RED=1,
GREEN=2,
BLUE=4
};
int main()
{
printf("%d",RED);//1
printf("%d",GREEN);//2
printf("%d",BLUE);//4
return 0;
}
或者這樣
enum Color//顏色
{
RED=10,
GREEN,
BLUE
};
int main()
{
printf("%d",RED);//10
printf("%d",GREEN);//11
printf("%d",BLUE);//12
return 0;
}
當然枚舉是類型還可以定義變量:
這個變量可以賦值枚舉常量的可能取值
enum Color//顏色
{
RED=10,
GREEN,
BLUE
};
int main()
{
enum Color c = RED; //定義枚舉變量,給它賦值枚舉常量的可能取值RED
printf("%d",c); //10
c = GREEN;
printf("%d",c); //11
// 注意點,枚舉常量是常量,所以不可以在使用過程中修改他的值
//RED = 3; //是錯誤的
return 0;
}
enum對比#define宏常量的好處
枚舉的優(yōu)點:
- 增加代碼的可讀性和可維護性;
- 和#define定義的標識符比較枚舉有類型檢查,更加嚴謹;
- 防止了命名污染(封裝);
- 便于調(diào)試;
- 使用方便,一次可以定義多個常量。
union的定義
union 是共用體,它的意思就是union 里面成員變量的集合是公用內(nèi)存空間的。
比如
//聯(lián)合類型的聲明
union Un
{
char c;
int i;
};
//聯(lián)合變量的定義
union Un un;
//計算連個變量的大小
printf("%d\n", sizeof(un)); //結(jié)果為4

成員變量 c占用一個字節(jié),成員變量i占用4個字節(jié),但是又一個字節(jié)和成員變量重疊了,這就是共用體
聯(lián)合體大小的計算
聯(lián)合的成員是共用同一塊內(nèi)存空間的,這樣一個聯(lián)合變量的大小,至少是最大成員的大小
當最大成員大小不是最大對齊數(shù)的整數(shù)倍的時候,就要對齊到最大對齊數(shù)的整數(shù)倍。
union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
//下面輸出的結(jié)果是什么?
printf("%d\n", sizeof(union Un1)); //結(jié)果為8
printf("%d\n", sizeof(union Un2));//結(jié)果為16
分析:
- 對于Un1,我們知道Un1的最大對齊數(shù)是4,假如沒有按對齊數(shù)的話,其大小為5,有對齊數(shù),就變?yōu)?;
- 對于Un2,我們知道Un2的最大對齊數(shù)是4,假如沒有對齊數(shù)的話,其大小為14,有對齊數(shù),就變?yōu)?6;
聯(lián)合體配合算大小端的問題
記得之前用類型轉(zhuǎn)化的方式計算得到計算機是大小端,現(xiàn)在我們可以用聯(lián)合體也得到計算機的大小端;
類型轉(zhuǎn)化得到大小端的方式
int check()
{
int a = 1; // 0x 00 00 00 01
//低地址 ----------------------->高地址
//小端:01 00 00 00
//大端:00 00 00 01
return *(char*)&a;
}
int main()
{
int ret = check();
if(ret == 1)
printf("小端模式");
else
printf("大端模式");
return 0;
}
聯(lián)合體的方式
union Un
{
char c;
int i;
};
int cheak()
{
u.i = 1;
//低地址 ----------------------->高地址
//小端:01 00 00 00
//大端:00 00 00 01
//如果是小端,返回1,不是返回0
return u.c;
}
int main()
{
int ret = check();
if(ret == 1)
printf("小端模式");
else
printf("大端模式");
return 0;
}
總結(jié)
到此這篇關(guān)于C語言中枚舉與聯(lián)合體使用的文章就介紹到這了,更多相關(guān)C語言枚舉與聯(lián)合體用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于CLion配置visual?studio(msvc)和JOM多核編譯的問題
這篇文章主要介紹了CLion配置visual?studio(msvc)和JOM多核編譯,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07
Qt圖形圖像開發(fā)之曲線圖模塊QCustomplot庫生成靜態(tài)、動態(tài)曲線詳細教程圖解
這篇文章主要介紹了Qt圖形圖像開發(fā)之曲線圖模塊QCustomplot庫畫靜態(tài)、動態(tài)曲線詳細教程圖解,需要的朋友可以參考下2020-03-03
C語言設(shè)置和取得socket狀態(tài)的相關(guān)函數(shù)用法
這篇文章主要介紹了C語言設(shè)置和取得socket狀態(tài)的相關(guān)函數(shù)用法,分別是setsockopt()函數(shù)和getsockopt()函數(shù)的使用介紹,需要的朋友可以參考下2015-09-09
C++ Template 基礎(chǔ)篇(一):函數(shù)模板詳解
這篇文章主要介紹了C++ Template函數(shù)模板,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04

