郴州seo排名搜外網(wǎng) seo教程
前言
最近在嘗試閱讀一些系統(tǒng)庫的源碼,但是其中存在很多讓我感到既熟悉又陌生的語法。經(jīng)過資料查閱,發(fā)現(xiàn)是 C 語言中的共用體和位域。于是,趁著課本還沒有扔掉,將一些相關(guān)的知識點記錄在本文。
文章目錄
- 前言
- 共用體 (union)
- 枚舉 (enum)
- 位域
- 參考資料
共用體 (union)
公用體和結(jié)構(gòu)體相似,也是一種數(shù)據(jù)構(gòu)造機制。但是結(jié)構(gòu)體中的各成員變量順序排列存儲,每個成員變量都有自己獨立存儲空間,而共用體中所有成員變量共享同一片內(nèi)存區(qū)域,一個共用體變量在每個時刻里只能保存它的某個成員變量的值。
定義格式如下:
union 共用體名 {成員列表
};
下面是共用體和結(jié)構(gòu)體占用內(nèi)存的情況:
#include <stdio.h>union UnionData {int a;float b;double c;char d;
};struct StructData {int a;float b;double c;char d;
};int main() {printf("%lu %lu\n", sizeof(UnionData), sizeof(StructData));return 0;
}
控制臺輸出結(jié)果:
8 24
共用體能支持在同一塊內(nèi)存區(qū)域?qū)Σ煌臄?shù)據(jù)類型進交替使用,增加了靈活性,節(jié)省了內(nèi)存,通常在系統(tǒng)庫中會有所應(yīng)用。
枚舉 (enum)
枚舉 (enumeration) 是一系列命名的整型常量,它是一種基本數(shù)據(jù)類型,而不是一種構(gòu)造類型。在“枚舉”類型的定義中,我們需要列舉出所有可能值,就像列舉一周七天、一年四季等。
定義格式如下:
enum 枚舉名 {枚舉列表};
枚舉的使用例子如下:
#include <stdio.h>// 枚舉定義
enum Season {SeasonSpring = 1,SeasonSummer,SeasonAutumn, SeasonWinter
};int main () {Season a = SeasonSpring;switch (a) {case SeasonSpring:printf("SeasonSpring\n");break;case SeasonSummer:printf("SeasonSummer\n");break;case SeasonAutumn:printf("SeasonAutumn\n");break;case SeasonWinter:printf("SeasonWinter\n");break;}return 0;
}
控制臺輸出結(jié)果:
1 2 3
位域
有些數(shù)據(jù)在存儲時并不需要占用一個完整的字節(jié),只需要占用一個或幾個二進制位即可。例如開關(guān)只有通電和斷電兩種狀態(tài),用 0 和 1 表示足以,也就是用一個二進位。
出于節(jié)省內(nèi)存的角度考慮,就有了位域這種設(shè)計。位域是 C 語音中一種特殊的結(jié)構(gòu)體成員,它允許我們指定它所占的內(nèi)存位數(shù)。
定義格式如下:
struct 位域結(jié)構(gòu)名 {類型說明符 位域名 : 位域長度;
};
說明:
- 一個位域必須存儲在同 1 個字節(jié)中,不能跨兩個字節(jié)。如果一個字節(jié)所剩的空間不足以存儲下一個位域時,應(yīng)該從下一個字節(jié)開始存儲。
- 位域長度不能大于 1 個字節(jié)長度,也就是說不能超過 8 位。
- 位域的數(shù)據(jù)類型只能是 int、unsigned int、char、枚舉等類型。
- 位域可以沒有位域名,因為無名的位域是不能使用的,所以只是用作填充或調(diào)整位置的作用。例如:
struct BitStruct {int a : 4;int : 2; // 空域,不能使用int b : 4;int c : 4; }
參考資料
- https://www.runoob.com/cprogramming/c-bit-fields.html
- https://book.douban.com/subject/26792521/
本文主要對 C 語言中,共用體、枚舉和位域等三塊內(nèi)容做簡單介紹,涉及到他們在工程中應(yīng)用的方面很少,如果后面閱讀系統(tǒng)源碼的過程遇到了,會再做進一步補充。