C語言枚舉與聯(lián)合圖文梳理講解
思維導圖
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
枚舉在定義后,成員的默認值是從0開始,一次遞增1。
#include <stdio.h> enum Sex//默認遞增1//第一個默認是0 { //枚舉是可以初始化初始值 MALE=1,//枚舉定義的是常量 FEMALE=2, SECRET=4 }; int main() { enum Sex s; printf("%d\n", sizeof(s));//枚舉類型的大小是4個字節(jié) printf("%d ", MALE); printf("%d ", FEMALE); printf("%d ", SECRET); //MALE=2;//不能修改 return 0; }
輸出:
輸出:
4
1 2 4
1.2 枚舉的優(yōu)點
1. 增加代碼的可讀性和可維護性。
2. 和#define定義的標識符比較枚舉有類型檢查,更加嚴謹。
3. 防止了命名污染(封裝)。
4. 便于調試。
5. 使用方便,一次可以定義多個常量。
1.3 枚舉的使用
我在實現(xiàn)靜態(tài)通訊錄時,
swich語句中的case1、2、3、4、5、6、0可讀性較差,
我們可以用枚舉使他變得更加直觀:
這是原來的實現(xiàn):
void test() { int input = 0; //創(chuàng)建通訊錄con Contact con; //初始化通訊錄 InitContact(&con);//分裝成函數(shù)實現(xiàn) do { menu();//打印菜單 printf("請選擇:>"); 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("選擇錯誤\n"); break; } } while (input); }
我們發(fā)現(xiàn),如果不依靠注釋,
我們很難辨別case0~6究竟要實現(xiàn)什么功能。
我們可以創(chuàng)建一個枚舉類型:
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("請選擇:>"); 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("選擇錯誤\n"); break; } } while (input); }
這樣的話,哪怕我們不依靠注釋,
也能清楚的知道不同case應該實現(xiàn)什么樣的功能。
2. 聯(lián)合(共用體)
2.1 聯(lián)合類型的定義
聯(lián)合體的成員公用同一塊空間(所以聯(lián)合也叫共用體)。
例:
#include <stdio.h> typedef union UN//這是一個聯(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)合體的一個特點:
2.2 聯(lián)合的特點
聯(lián)合的成員是共用同一塊內存空間的,這樣一個聯(lián)合變量的大小,
至少是最大成員的大?。ㄒ驗槁?lián)合至少得有能力保存最大的那個成員)。
2.3 聯(lián)合大小的計算
聯(lián)合的大小至少是最大成員的大小。
當最大成員大小不是最大對齊數(shù)的整數(shù)倍的時候,就要對齊到最大對齊數(shù)的整數(shù)倍。
例:
#include <stdio.h> typedef union Un { char c[5];//5個char類型占用5個字節(jié),對齊后占用8個 int n;//共用內存 }Un; typedef union Un2 { short c[7];//7個short占用14個字節(jié),對齊后占用16個 int n;//共用內存 }Un2; int main() { Un un; Un2 un2; printf("%d\n", sizeof(un)); printf("%d\n", sizeof(un2)); return 0; }
輸出:
輸出:
8
16
以及,我們可以用聯(lián)合體計算大小端:
例:
這是我們之前判斷的方法:
#include <stdio.h> int main() { int a = 1;//0x00 00 00 01 //小端存儲的方式: //低地址------>高地址 //0x01 00 00 00 if (*(char*)&a == 1) { printf("小端\n"); } else { printf("大端\n"); } return 0; }
輸出:
輸出:小端
這是用聯(lián)合體實現(xiàn)的方法:
利用內存共用的特性:
#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; }
輸出:
輸出:小端
到此這篇關于C語言枚舉與聯(lián)合圖文梳理講解的文章就介紹到這了,更多相關C語言枚舉與聯(lián)合內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!