枚舉+聯合
- 一.枚舉類型
- 1.枚舉類型的聲明
- 2.枚舉類型的優點
- 3.枚舉類型的使用
- 二.聯合體
- 1.聯合體類型的聲明
- 2.聯合體的特點
- 3.相同成員的結構體和聯合體對比
- 4.聯合體大小的計算
- 5.聯合體的練習(判斷大小端)
- 6.聯合體節省空間例題
一.枚舉類型
1.枚舉類型的聲明
- 枚舉顧名思義就是一一列舉,把可能的取值一一列舉。
比如我們現實生活中:
- 一周的星期?到星期日是有限的7天,可以一一列舉。
- 性別有:男、女、保密,也可以一一列舉。
- 月份有12個月,也可以一一列舉。
- 三原色,也是可以一一列舉。
這些數據的表示就可以使用枚舉了,代碼如下:
#include<stdio.h>
enum Day//星期
{//該枚舉類型有七種可能值,它們都是常量,被稱為枚舉常量Mon,Tues,Wed,Thur=9,Fri,Sat,Sun
};
int main()
{enum Day day1 = Mon;enum Day day2 = Sun;printf("%d\n", Mon);//0printf("%d\n", Tues);//1printf("%d\n", Wed);//2printf("%d\n", Thur);//9printf("%d\n", Fri);//10printf("%d\n", Sat);//11printf("%d\n", Sun);//12return 0;
}
- 以上定義的 enum Day ,是枚舉類型。
- { }中的內容是枚舉類型的可能取值,也叫枚舉常量。
- 枚舉類型的值通常是整數常量。
- 這些可能取值都是有值的,默認從0開始,依次遞增1,當然在聲明枚舉類型的時候也可以賦初值,后面的值也是依次遞增1。
2.枚舉類型的優點
- 我們可以使用 #define 定義常量,為什么非要使用枚舉?
枚舉的優點:
-
增加代碼的可讀性和可維護性。
-
和 #define 定義的標識符比較枚舉有類型檢查,更加嚴謹。
-
便于調試,預處理階段會刪除 #define 定義的符號。
-
使用方便,一次可以定義多個常量。
-
枚舉常量是遵循作用域規則的,枚舉聲明在函數內,只能在函數內使用。
3.枚舉類型的使用
- 枚舉舉例:寫一個計算器完成整數的加法,減法,乘法,除法
#include<stdio.h>
enum Option
{EXIT,//0ADD,//1SUB,//2MUL,//3DIV//4
};
void menu()
{printf("*************************\n");printf("**1:add 2:sub**\n");printf("**3:mul 4:div**\n");printf("**0:exit \n");printf("*************************\n");
}
int Add(int x, int y)
{return x + y;
}
int Sub(int x, int y)
{return x - y;
}
int Mul(int x, int y)
{return x * y;
}
int Div(int x, int y)
{return x / y;
}
int Cal(int(*pf)(int, int))
{int ret = 0;int x = 0;int y = 0;printf("請輸入兩個數:>");scanf("%d %d", &x, &y);ret = pf(x, y);printf("%d\n", ret);
}
int main()
{int input = 0;do{menu();printf("請選擇:>");scanf("%d", &input);switch (input){case ADD:Cal(Add);break;case SUB:Cal(Sub);break;case MUL:Cal(Mul);break;case DIV:Cal(Div);break;case EXIT:printf("退出\n");break;default:printf("選擇錯誤,請重新選擇\n");break;}} while (input);return 0;
}
二.聯合體
1.聯合體類型的聲明
- 像結構體?樣,聯合體也是由?個或者多個成員構成,這些成員可以不同的類型,但是編譯器只為最大的成員分配足夠的內存空間。
- 聯合體的特點是所有成員共?同?塊內存空間。所以聯合體也叫:共用體。
#include<stdio.h>
union Un//聯合體
{char c;int i;
};
int main()
{printf("%zd\n", sizeof(union Un));//4個字節return 0;
}
- 運行可知聯合體union Un只占用4個字節,這是為什么呢?
2.聯合體的特點
- 聯合的成員是共用同一塊內存空間的,這樣一個聯合變量的大小,至少是最大成員的大小(因為聯合至少得有能力保存最大的那個成員)。
- 修改聯合體其中?個成員,其他成員的值也跟著變化。
#include<stdio.h>
union Un
{char c;int i;
};
int main()
{union Un un = { 0 };printf("& un =%p\n", &un);printf("&(un.c)=%p\n", &(un.c));printf("&(un.i)=%p\n", &(un.i));return 0;
}
#include <stdio.h>
//聯合類型的聲明
union Un
{char c;int i;
};
int main()
{//聯合變量的定義 union Un un = { 0 };un.i = 0x11223344;un.c = 0x55;printf("%x\n", un.i);//11223355return 0;
}
3.相同成員的結構體和聯合體對比
#include<stdio.h>
struct S//結構體
{char c;int i;
};
union Un//聯合體
{char c;int i;
};
int main()
{printf("%zd\n", sizeof(struct S));//8個字節printf("%zd\n", sizeof(union Un));//4個字節return 0;
}
- 對比一下相同成員的結構體和聯合體的內存布局情況。
4.聯合體大小的計算
- 聯合的大小至少是最大成員的大小。
- 當最大成員大小不是最大對齊數的整數倍的時候,聯合的大小就是最大對齊數的整數倍。
#include<stdio.h>
union Un
{char arr[5];//相當于五個char變量,char c1;char c2;char c3;char c4;char c5;//自身大小:1,默認對齊數:8,對齊數:1int i;//自身大小:4,默認對齊數:8,對齊數:4//二者的最大對齊數是4,聯合體的總大小是4的倍數,//而5不是4的倍數,所以聯合體的大小是8
};
union Un2
{short c[7];//14 2 8 2int i;// 4 8 4
};
int main()
{printf("%zd\n", sizeof(union Un));//8printf("%d\n", sizeof(union Un2));//16return 0;
}
5.聯合體的練習(判斷大小端)
#include<stdio.h>
int check_sys()
{union{int i;char c;}un;un.i = 1;return un.c;//返回1是小端,返回0是大端
}
int main()
{if (check_sys() == 1)printf("小端\n");elseprintf("大端\n");return 0;
}
6.聯合體節省空間例題
- 比如,我們要搞一個活動,要上線一個禮品兌換單,禮品兌換單中有三種商品:圖書、杯子、襯衫。每?種商品都有:庫存量、價格、商品類型和商品類型相關的其他信息。
- 圖書:書名、作者、頁數。
- 杯子:設計。
- 襯衫:設計、可選顏色、可選尺寸。
那我們不耐心思考,直接寫出以下結構:
#include<stdio.h>
struct gift_list
{//公共屬性 int stock_number;//庫存量 double price; //定價 int item_type;//商品類型 //特殊屬性 char title[20];//書名 char author[20];//作者 int num_pages;//頁數 char design[30];//設計 int colors;//顏色int sizes;//尺寸
};
- 上述的結構其實設計的很簡單,用起來也方便,但是結構的設計中包含了所有禮品的各種屬性,這樣使得結構體的大小就會偏大,比較浪費內存。因為對于禮品兌換單中的商品來說,只有部分屬性信息是常用的。
比如:
- 商品是圖書,就不需要design、colors、sizes。所以我們就可以把公共屬性單獨寫出來,剩余屬于各種商品本身的屬性使用聯合體起來,這樣就可以介紹所需的內存空間,一定程度上節省了內存,代碼如下:
struct gift_list
{int stock_number;//庫存量double price; //定價int item_type;//商品類型//匿名聯合體:只用一次union{struct//匿名結構體:只用一次{char title[20];//書面char author[20];//作者int num_pages;//頁數}book;struct//匿名結構體:只用一次{char design[30];//設計}mug;struct//匿名結構體:只用一次{char design[30];//設計int colors;//顏色int sizes;//尺寸}shirt;}item;//g.item.book.num_pages=20;
}g;
創作不易,如果能幫到你的話能賞個三連嗎?感謝啦!!!