如何做酒店網(wǎng)站設(shè)計uc瀏覽器關(guān)鍵詞排名優(yōu)化
目錄
枚舉
什么是枚舉類型?
枚舉的聲明
枚舉的定義
枚舉的優(yōu)點
枚舉的使用
聯(lián)合(共用體)
什么是聯(lián)合呢?
聯(lián)合類型的定義
聯(lián)合的特點
聯(lián)合使用
聯(lián)合大小的計算
聯(lián)合的應(yīng)用
今天接著我們來結(jié)束自定義類型。🆗🆗
枚舉
在初始C語言中學習常量有:字母常量 #define定義的標識符常量 cosnt修飾的常變量 枚舉常量
什么是枚舉類型?
枚舉顧名思義就是【一一列舉】。把可能的取值一一列舉。比如我們現(xiàn)實生活中:一周的星期一到星期日是有限的7天,可以一一列舉。人的性別有;男,女,保密,也可以一一列舉。月份有12個月,也可以一一列舉。所以就有了枚舉類型。
enum tag
{possible value membermember1,member2,member3
};
- enum 枚舉關(guān)鍵字 不能省略
- tag 標簽 自定義
- member 枚舉的可能取值_枚舉常量??后面是逗號,最后沒有逗號,
- 分號; 不要忘記?
枚舉的聲明
//枚舉類型的聲明
enum Sex
{MALE,FEMALE,SECRET
};
enum Color
{RED,GREEN,BLUE
};
- 簡單理解,定義一種枚舉類型,這種類型有有限的取值
- 枚舉類型所定義的枚舉的常量是不能被修改的
- 枚舉常量默認值是從0開始,依次+1的值
- 枚舉常量的默認值是可以在? 聲明枚舉常量 的時候初始化為別的值
#include<stdio.h>
enum Sex
{MALE=4,//okFEMALE=5,//okSECRET=6
};
enum Sex
{MALE=4,//okFEMALE,//ok 5SECRET//6
};
int main()
{MALE=5//err?return 0;
}
枚舉的定義
這樣定義變量看似可以,但是不建議這樣寫。?
//枚舉類型的聲明
#include<stdio.h>
enum Sex
{MALE,FEMALE,SECRET
};
int main()
{enum Sex sex = MALE;//OKenum Sex sex = 2;//err?//枚舉類型 //整型printf("%d\n", sizeof(sex));//4return 0;
}
枚舉的優(yōu)點
我們拋出一個問題為什么要用枚舉?我們可以使用 #define 定義常量,為什么非要使用枚舉?
enum Sex
{MALE,FEMALE,SECRET
};
//類型#define MALE 3
#define FEMALE 4
#define SECRET 5
//替換
- 增加代碼的可讀性和可維護性
- 和#define定義的標識符比較枚舉有類型檢查,更加嚴謹。
- 防止了命名污染(封裝)
- 便于調(diào)試
- 使用方便,一次可以定義多個常量
以上都是非常重要的原因,在平時寫代碼我們很少用到枚舉,但是留時間寫代碼,總會有所感悟的
枚舉的使用
enum Color//顏色
{
RED=1,
GREEN=2,
BLUE=4
};
enum Color clr = GREEN;//只能拿枚舉常量給枚舉變量賦值,才不會出現(xiàn)類型的差異。
聯(lián)合(共用體)
什么是聯(lián)合呢?
聯(lián)合也是一種特殊的自定義類型 這種類型定義的變量也包含一系列的成員,特征是這些【成員公用同一塊空間】(所以聯(lián)合也叫共用體)。
union tag
{member - list;
};
- ?union 聯(lián)合關(guān)鍵字
- ?tag標簽 自定義
- ?member-list 成員列表
- 分號; 不要忘記
聯(lián)合類型的定義
union Un
{char c;int i;
};
聯(lián)合的特點
?下面代碼那我們猜測一下大小是5個字節(jié)嗎??
#include<stdio.h>
union Un
{char c;int i;
};
int main()
{union Un un;printf("%d\n", sizeof(un));//?return 0;
}
?既然都這么問了,那肯定不是5個字節(jié)的大小。提醒:聯(lián)合體的成員是公用一塊空間。?
?聯(lián)合的成員是共用同一塊內(nèi)存空間的,這樣一個聯(lián)合變量的大小,至少是最大成員的大小(因為聯(lián)合至少得有能力保存最大的那個成員)。
#include<stdio.h>
union Un
{char c;int i;
};
int main()
{union Un un;printf("%d\n", sizeof(un));printf("%p\n", &un.c);printf("%p\n", &un.i);return 0;
}
?
特點:公用同一塊空間。所以改變c的同時會改變i,同一時間只能訪問使用一個數(shù)據(jù)。?
聯(lián)合使用
?面試題:判斷當前計算機的大小端存儲
忘記了大小端的戳一戳:C語言之整數(shù)_數(shù)據(jù)存儲篇(1)-CSDN博客?
#include<stdio.h>
int check(int i)
{int* p = &i;return *(char*)p;
}
int main()
{int i = 1;int ret=check(i);if (ret == 1){printf("小端存儲");}else{printf("大端存儲\n");}return 0;
}
用我們的聯(lián)合也可以輕松搞定!!?
#include<stdio.h>
int check(int i)
{union Un//可以用匿名聯(lián)合{char c;int i;};union Un un;un.i = 1;return un.c;
}
int main()
{int i = 0;int ret=check(i);if (ret == 1){printf("小端存儲");}else{printf("大端存儲\n");}return 0;
}
聯(lián)合大小的計算
- 聯(lián)合的大小至少是最大成員的大小。
- 當最大成員大小不是最大對齊數(shù)的整數(shù)倍的時候,就要對齊到最大對齊數(shù)的整數(shù)倍。
聯(lián)合體的大小是最大成員的大小對嗎?當然是錯誤的。
#include<stdio.h>
union Un
{char c[5];int i;
};
int main()
{union Un un;printf("%d\n", sizeof(un));return 0;
}
這個和我們上篇博文講的對齊有關(guān),大家自己算一算。?
union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
//下面輸出的結(jié)果是什么?
printf("%d\n", sizeof(union Un1));//8
printf("%d\n", sizeof(union Un2));//16
聯(lián)合的應(yīng)用
【后面博客我們會講通訊錄的程序🆗】
?????最后,感謝大家的閱讀,若有錯誤和不足,歡迎指正!
下篇博文我們學習動態(tài)內(nèi)存管理。🆗🆗
代碼------→【gitee:唐棣棣 (TSQXG) - Gitee.com】
聯(lián)系------→【郵箱:2784139418@qq.com】