一、列舉(enum)
介紹:
列舉是 C 語言中的一種基本資料型別,它可以讓資料更簡潔,更易讀,
定義:
①先定義列舉型別,再定義列舉變數
enum Sex { Male, Female, Secret }; enum Sex sex;
②定義列舉型別的同時定義列舉變數
enum DAY { Male,Female,Secret } sex;
③匿名定義列舉變數(只能定義一個)
enum { Male,Female,Secret } Sex;
初始:
enum Sex { Male, //第一個列舉常量默認為0 Female = 2, //可給列舉常量賦值(只能賦值一次) Secret //值為3,默認為前面的值+1 };
//enum Sex sex = 3; 這樣寫在C語言中不會報錯,但在C++中會報錯
enum Sex sex = (Sex)3;
printf("%d",sizeof(Sex)); //enum型別默認為4個位元組
優點:
1,增加代碼的可讀性和可維護性
2,和#define 定義的識別符號比較列舉有型別檢查,更加嚴謹
3,防止命名污染(命名沖突)
4,便于除錯,例如定義了SUM=3, 除錯時列舉可以看到實際值3,#define只是看到SUM,不知道實際值
5,使用方便,一次可以定義多個常量
擴展:
在C 語言中,列舉型別是被當做 int 或者 unsigned int 型別來處理的,所以按照 C 語言規范是沒有辦法遍歷列舉型別的,
不過在一些特殊的情況下,列舉型別的值連續可以實作有條件的遍歷
enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } day; int main() { for (day = MON; day <= SUN; day++) { } }
二、聯合體(union)
介紹:
聯合體里面所有成員都共用一塊記憶體,使用時候,所有成員屬性選一個,
定義:
①先定義union型別,再定義union變數
union Un { int a; char b[5]; }; union Un un;
②定義union型別的同時定義union變數
union Un { int a; char b[5]; }un;
③匿名定義union變數(只能定義一次)
union { int a; char b[5]; }un;
注意:
聯合的成員是公用同一塊記憶體空間的,這聯合體的大小至少是最大成員的大小,
當最大成員大小不是最大對齊數的整數倍時就要對齊到最大對齊數的整數倍
union Un { int a; // 4 8 char b[5]; // 5 8 }; printf("%d", sizeof(Un)); //結果為8
擴展:
①驗證編譯器的大小端存盤模式
int a = 11223344,其在記憶體中的二進制補碼為:
00000000 10101011 01000001 00110000
大小端存盤模式:
低地址-----------------------------------------------------------高地址
.......[ ][ ][00000000][10101011][01000001][00110000][ ][ ]........ 大端位元組序存盤模式
.......[ ][ ][00110000][01000001][10101011][00000000][ ][ ]........ 小端位元組庫存盤模式
由此可見,資料的低位元組存在高地址的存盤模式為大端位元組序存盤模式,
資料的低位元組存盤在低地址的存盤模式為小端位元組序存盤模式,
驗證法一:
將a的整型地址強制轉換為字符型地址再解參考( *(char*)&a )觀察其值,
若為0則說明是大端模式,若為48(00110000)則說明是小端位元組序存盤模式
驗證法二:
union Un
{
int a;
char b;
};
union Un un;
通過給un.a賦值,查看un.a與un.b的值
②分離高低位元組
單片機中經常會遇見分離高低位元組的操作,比如進行計時中斷復位操作時往往會進行
(65535-200)/256; (65535-200)%256;這樣的操作,而一個除法消耗四個機器周期,取余也需要進行一系列復雜的運算,如果在短時間內需要進行很多次這樣的運算無疑會給程式帶來巨大的負擔,其實進行這些操作的時候我們需要的僅僅是高低位元組的資料分離而已,這樣利用聯合體我們很容易降低這部分開銷,需注意的是:聯合體內資料是按地址對齊的,具體是高位資料還是低位資料要看平臺的大小端模式,例如
51是大端,stm32默認是小端,
union div { int time_count; // time_count中存放要進行分離高低位元組的資料 char T1[2]; // 在keil c中一個整形占兩個位元組,char占一個位元組,所以n與陣列a占的位元組數相同 }test; test.time_count = 65535-200; TH1 = test.a[0]; // test.T1[0]中存盤的是time_count 高位資料 TL1 = test.a[1]; // test.T1[1]中儲存的是time_count 低位資料
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/471733.html
標籤:C
下一篇:使用Go搭建并行排序處理管道筆記
