C語(yǔ)言枚舉與聯(lián)合圖文梳理講解
思維導(dǎo)圖
1.枚舉
1.1 枚舉類型的定義
例:
enum Day//星期 { Mon, Tues, Wed, Thur, Fri, Sat, Sun }; enum Sex//性別 { MALE, FEMALE, SECRET }; enum Color//顏色 { RED, GREEN, BLUE };
上述這些,都是枚舉的定義。
例:
#include <stdio.h> enum Sex { MALE, FEMALE, SECRET }; int main() { printf("%d\n", MALE); printf("%d\n", FEMALE); printf("%d\n", SECRET); return 0; }
輸出:
輸出:
0
1
2
枚舉在定義后,成員的默認(rèn)值是從0開始,一次遞增1。
#include <stdio.h> enum Sex//默認(rèn)遞增1//第一個(gè)默認(rèn)是0 { //枚舉是可以初始化初始值 MALE=1,//枚舉定義的是常量 FEMALE=2, SECRET=4 }; int main() { enum Sex s; printf("%d\n", sizeof(s));//枚舉類型的大小是4個(gè)字節(jié) printf("%d ", MALE); printf("%d ", FEMALE); printf("%d ", SECRET); //MALE=2;//不能修改 return 0; }
輸出:
輸出:
4
1 2 4
1.2 枚舉的優(yōu)點(diǎn)
1. 增加代碼的可讀性和可維護(hù)性。
2. 和#define定義的標(biāo)識(shí)符比較枚舉有類型檢查,更加嚴(yán)謹(jǐn)。
3. 防止了命名污染(封裝)。
4. 便于調(diào)試。
5. 使用方便,一次可以定義多個(gè)常量。
1.3 枚舉的使用
我在實(shí)現(xiàn)靜態(tài)通訊錄時(shí),
swich語(yǔ)句中的case1、2、3、4、5、6、0可讀性較差,
我們可以用枚舉使他變得更加直觀:
這是原來的實(shí)現(xiàn):
void test() { int input = 0; //創(chuàng)建通訊錄con Contact con; //初始化通訊錄 InitContact(&con);//分裝成函數(shù)實(shí)現(xiàn) do { menu();//打印菜單 printf("請(qǐng)選擇:>"); scanf("%d", &input);//選擇功能 switch(input) { case 1: //增加聯(lián)系人 AddContact(&con); break; case 2: //刪除聯(lián)系人 DelContact(&con); break; case 3: //查找聯(lián)系人 SearchContact(&con); break; case 4: //修改指定聯(lián)系人 ModifyContact(&con); break; case 5: //整理通訊錄(按類型排序) SortContact(&con); break; case 6: //顯示通訊錄的信息 ShowContact(&con); break; case 0: //退出通訊錄 printf("通訊錄已退出\n"); break; default: printf("選擇錯(cuò)誤\n"); break; } } while (input); }
我們發(fā)現(xiàn),如果不依靠注釋,
我們很難辨別case0~6究竟要實(shí)現(xiàn)什么功能。
我們可以創(chuàng)建一個(gè)枚舉類型:
enum Option { EXIT,//0 ADD, DEL, SEARCH, MODIFY, SORT, SHOW }; void test() { int input = 0; //創(chuàng)建通訊錄con Contact con; //初始化通訊錄 InitContact(&con); do { menu(); printf("請(qǐng)選擇:>"); scanf("%d", &input); switch(input) { case ADD: AddContact(&con); break; case DEL: DelContact(&con); break; case SEARCH: SearchContact(&con); break; case MODIFY: ModifyContact(&con); break; case SORT: SortContact(&con); break; case SHOW: ShowContact(&con); break; case EXIT: printf("通訊錄已退出\n"); break; default: printf("選擇錯(cuò)誤\n"); break; } } while (input); }
這樣的話,哪怕我們不依靠注釋,
也能清楚的知道不同case應(yīng)該實(shí)現(xiàn)什么樣的功能。
2. 聯(lián)合(共用體)
2.1 聯(lián)合類型的定義
聯(lián)合體的成員公用同一塊空間(所以聯(lián)合也叫共用體)。
例:
#include <stdio.h> typedef union UN//這是一個(gè)聯(lián)合體 { char c; int i; }UN; int main() { UN un; printf("%d\n", sizeof(un)); printf("%p\n", &un); printf("%p\n", &(un.c)); printf("%p\n", &(un.i)); return 0; }
輸出:
輸出:
4
006FF7D0
006FF7D0
006FF7D0
通過觀察可以發(fā)現(xiàn),他們的地址都是相同的。
這是聯(lián)合體的一個(gè)特點(diǎn):
2.2 聯(lián)合的特點(diǎn)
聯(lián)合的成員是共用同一塊內(nèi)存空間的,這樣一個(gè)聯(lián)合變量的大小,
至少是最大成員的大?。ㄒ?yàn)槁?lián)合至少得有能力保存最大的那個(gè)成員)。
2.3 聯(lián)合大小的計(jì)算
聯(lián)合的大小至少是最大成員的大小。
當(dāng)最大成員大小不是最大對(duì)齊數(shù)的整數(shù)倍的時(shí)候,就要對(duì)齊到最大對(duì)齊數(shù)的整數(shù)倍。
例:
#include <stdio.h> typedef union Un { char c[5];//5個(gè)char類型占用5個(gè)字節(jié),對(duì)齊后占用8個(gè) int n;//共用內(nèi)存 }Un; typedef union Un2 { short c[7];//7個(gè)short占用14個(gè)字節(jié),對(duì)齊后占用16個(gè) int n;//共用內(nèi)存 }Un2; int main() { Un un; Un2 un2; printf("%d\n", sizeof(un)); printf("%d\n", sizeof(un2)); return 0; }
輸出:
輸出:
8
16
以及,我們可以用聯(lián)合體計(jì)算大小端:
例:
這是我們之前判斷的方法:
#include <stdio.h> int main() { int a = 1;//0x00 00 00 01 //小端存儲(chǔ)的方式: //低地址------>高地址 //0x01 00 00 00 if (*(char*)&a == 1) { printf("小端\n"); } else { printf("大端\n"); } return 0; }
輸出:
輸出:小端
這是用聯(lián)合體實(shí)現(xiàn)的方法:
利用內(nèi)存共用的特性:
#include <stdio.h> typedef union Un { char c; int i; }Un; int main() { int a = 1; Un un; un.i = 1; if (un.c == 1) { printf("小端\n"); } else { printf("大端\n"); } return 0; }
輸出:
輸出:小端
到此這篇關(guān)于C語(yǔ)言枚舉與聯(lián)合圖文梳理講解的文章就介紹到這了,更多相關(guān)C語(yǔ)言枚舉與聯(lián)合內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言中聯(lián)合體與共用體和枚舉使用語(yǔ)法示例
- C語(yǔ)言枚舉與聯(lián)合體深入詳解
- 詳解C語(yǔ)言結(jié)構(gòu)體,枚舉,聯(lián)合體的使用
- C語(yǔ)言中的自定義類型之結(jié)構(gòu)體與枚舉和聯(lián)合詳解
- C語(yǔ)言深入探究自定義類型之結(jié)構(gòu)體與枚舉及聯(lián)合
- C語(yǔ)言自定義類型超詳細(xì)梳理之結(jié)構(gòu)體 枚舉 聯(lián)合體
- C語(yǔ)言關(guān)于自定義數(shù)據(jù)類型之枚舉和聯(lián)合體詳解
- C語(yǔ)言結(jié)構(gòu)體,枚舉,聯(lián)合體詳解
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)短字符串壓縮的三種方法詳解
這篇文章主要和大家分享一下smaz,shoco,unisox2三種短字符串壓縮算法,并分別探索它們各自的壓縮率與壓縮和解壓縮性能,需要的可以參考一下2022-08-08C語(yǔ)言實(shí)現(xiàn)電腦關(guān)機(jī)程序
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)電腦關(guān)機(jī)程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02C語(yǔ)言求兩個(gè)字符串的最長(zhǎng)公共子串
這篇文章主要介紹了C語(yǔ)言求兩個(gè)字符串的最長(zhǎng)公共子串,實(shí)例分析了C語(yǔ)言操作字符串的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02