国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【C語言進階】自定義類型(2)枚舉&聯(lián)合

leiyi / 1034人閱讀

目錄

一、枚舉

(一)枚舉類型的定義

(二)使用枚舉的原因?

(三)枚舉的優(yōu)點?

(四)枚舉的大小

(五)枚舉的使用

二、聯(lián)合(共用體)

(一)聯(lián)合類型的定義

(二)聯(lián)合的特點

(三)面試題

(四)聯(lián)合大小的計算



一、枚舉

枚舉顧名思義就是:列舉?。? ?即把可能的取值一一列舉出來

比如我們現(xiàn)實生活中:

  • 一周當中從周一至周日的7天,可以一一列舉;
  • 性別有:男、女、保密,可以一一列舉;
  • 月份有12個月,可以一一列舉;
  • 顏色有赤橙黃綠親藍紫等,可以一一列舉;
  • ......

(一)枚舉類型的定義

這里我們直接上代碼:

//枚舉類型#include enum Sex//性別{    //枚舉的可能取值-常量	MALE = 2,	FEMALE = 4,	SECRET = 8    //以上為給常量賦一個初始值};enum Day//星期{	Mon,	Tues,	Wed,	Thur,	Fri,	Sat,	sun};enum Color//顏色--三原色 RGB{	RED,//0	GREEN,//1	BLUE//2};int main(){    printf("%d %d %d/n", RED, GREEN, BLUE);    printf("%d %d %d/n", MALE, FEMALE, SECRET);    return 0;}

執(zhí)行結果:

以上定義的 enum Dayenum Sexenum Color 都是枚舉類型。 { } 中的內容是枚舉類型的可能取值,也叫 枚舉常量

這些可能取值都是有值的,默認從0開始,一次遞增1,當然在定義的時候也可以賦初值,這些值叫做枚舉常量

上文代碼中 enum Sex 枚舉類型中的值就為枚舉常量,其中的常量值為248

(二)使用枚舉的原因?

我們可以使用#define定義常量,為什么非要使用枚舉呢??

#include #define RED 0#define GREEN 1#define BLUE 2int main(){    int color = RED;    return 0;}

(三)枚舉的優(yōu)點?

1.增加代碼的可讀性和可維護性
2.和#define定義的標識符比較枚舉有類型檢查,而#define定義的標識符是無類型的,所以更加的嚴謹。
3.防止了命名污染(封裝)
4.便于調試
5.使用方便,一次可以定義多個常量


(四)枚舉的大小

enum的大小該如何去求呢?

例:

#include enum Sex{    MALE,    FEMALE,    SECRET};int main(){    enum Sex s = MALE;    printf("%d/n", sizeof(s));    return 0;}

執(zhí)行結果:

?思考:為什么這里的結果為4呢?


分析:

首先這里 MALE 實際意義上是一個整數(shù),因為他的枚舉常量值默認為 0,而 0 是一個整數(shù),這里不管賦值給?FEMALESECRET?,他們的枚舉常量值1、2都是一個整數(shù),那么此時s就是一個整形類型的變量值,所以 enum 的值為4

(五)枚舉的使用

enum Color//顏色{  RED=1,  GREEN=2,  BLUE=4 }; int main(){    enum Color clr = GREEN;//只能拿枚舉常量給枚舉變量賦值,才不會出現(xiàn)類型的差異。    clr = 5;     return 0;}

?思考:clr = 5可行嗎??


解答:NO!?


原因:

枚舉常量和常量值是有區(qū)別的,將常量直接賦值給枚舉常量類型,編譯器會報錯或警告?

注:枚舉類型的常量如果中間某個值被自定義賦值,那么其前面的值仍然從0開始遞增,其后面的值按照自定義的值遞增。

總結:枚舉是一種類型,可以用來定義變量(枚舉變量),但是其成員是常量值(枚舉常量)

二、聯(lián)合(共用體)

(一)聯(lián)合類型的定義

聯(lián)合也是一種特殊的自定義類型 這種類型定義的變量也包含一系列的成員,特征是這些成員公用同一塊空間。(所以聯(lián)合也叫共用體)

例:

//聯(lián)合-聯(lián)合體-共用體#include union Un //共用體類型的聲明{    char c;//1    int i;//4};//5個字節(jié)int main(){    union Un u;    printf("%d/n", sizeof(u));    printf("%d/n", sizeof(u.c));    printf("%d/n", sizeof(u.i));        printf("%p/n", &u);    printf("%p/n", &(u.c));    printf("%p/n", &(u.i));    return 0;}

執(zhí)行結果:

分析:?

當然此處第一塊空間并不是 u.iu.c 各占一半空間,而是共用了一塊空間,u.i 的地址也就和 u.c一樣了

(二)聯(lián)合的特點

聯(lián)合的成員是共用同一塊內存空間的,這樣一個聯(lián)合變量的大小,至少是最大成員的大小(因為聯(lián)合至少得有能力保存最大的那個成員)


(三)面試題:

判斷當前計算機的大小端存儲

#include check_system(){    union    {        char c;        int i;    }u;    u.i = 1;    //返回1,表示小端    //返回0,表示大端    return u.c;}int main(){    //int a = 0x11 22 33 44;    //低地址——————————————————>高地址    //...[][][][][11][22][33][44][][][][]...  大端字節(jié)序存儲模式    //...[][][][][44][33][22][11][][][][]...  小端字節(jié)序存儲模式    //討論一個數(shù)據(jù)放在內存中存放的字節(jié)順序(大小端字節(jié)序問題)    int a = 1;    int ret = check_system();    if(1 == ret)        printf("小端/n");    else        printf("大端/n");    return 0;}

如果這邊對于大小端的內容有所遺忘/不了解的可以到我的另一篇博文中再復習學習一遍哦,鏈接放在下方?!

【C語言進階】數(shù)據(jù)在內存中的存儲

(四)聯(lián)合大小的計算

  • 共用體的大小至少是最大成員的大小。
  • 當最大成員大小不是最大對齊數(shù)的整數(shù)倍的時候,就要對齊到最大對齊數(shù)的整數(shù)倍。

例:?

#include union U1{    int a;//4     char arr[5];//5union U2{    short s[7];//7	int b;//4};int main(){    union U1 u1;    union U2 u2;    printf("%d/n", sizeof(u1));    printf("%d/n", sizeof(u2));    return 0;}

執(zhí)行結果:

分析:

u1:

數(shù)組a為整型,大小為4個字節(jié),他的默認對齊數(shù)為8,對齊數(shù)是4

而arr是字符數(shù)組,其中有5個元素,大小為5 * 1 = 14個字節(jié),他的默認對齊數(shù)是8,對齊數(shù)是1。

5不是最大對齊數(shù)4的倍數(shù),所以浪費3個字節(jié)后為8個字節(jié),而對齊到4的倍數(shù)后大小為8


u2:

數(shù)組s為短整型數(shù)組,有7個元素,大小為7 * 2 = 14個字節(jié),他的默認對齊數(shù)是16,對齊數(shù)是14

數(shù)組b為整型,大小為4個字節(jié),默認對齊數(shù)就是8,對齊數(shù)是4

14不是最大對齊數(shù)4的倍數(shù),所以浪費2個字節(jié)后為16個字節(jié),對齊到4的倍數(shù)后大小為16

總結:結構體、共用體是存在內存對齊的。

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/119107.html

相關文章

  • C語言進階】??數(shù)據(jù)類型&&整型在內存中的存儲

    目錄 ? ?一、數(shù)據(jù)類型介紹 二、類型的意義 三、類型的基本歸類 整型家族 浮點數(shù)家族 構造類型(自定義類型) 指針類型 空類型 四、整形在內存中的存儲 原碼、反碼、補碼 大小端字節(jié)序 為什么有大端和小端? 一道經(jīng)典筆試題 ?一、數(shù)據(jù)類型介紹 數(shù)據(jù)從大的方向分為兩類: 內置類型自定義類型內置類型我們前面已經(jīng)學習過,如下: char? ? ? ? ? ? //字符數(shù)據(jù)類型 short? ? ? ...

    Xufc 評論0 收藏0
  • C語言中還有這些類型,別再說你不知道了!手把手帶你解鎖C語言中的定義類型,讓你寫你所想。

    摘要:結構體類型的特殊聲明在初階結構體中,我們已經(jīng)將了結構體類型是如何進行聲明的,那么在這里,我們將講一些特殊的結構體聲明不完全的聲明。所以我們應該這樣寫通過指針來找到下一個同類型結構體的寫法,我們就稱之為結構體的自引用。 ...

    hizengzeng 評論0 收藏0
  • C語言進階】字符串&內存函數(shù)

    摘要:字符串常量適用于那些對它不做修改的字符串函數(shù)。同時,語言提供了一系列庫函數(shù)來對操作字符串,這些庫函數(shù)都包含在頭文件中。目標空間必須足夠大,以確保能存放源字符串。拷貝個字符從源字符串到目標空間。 前言: ????????字符串是一種非常重要的數(shù)據(jù)類型,但是C語言不存在顯式的字符串類型,C...

    pingan8787 評論0 收藏0
  • Python超細膩研究面向對象設計

      面向對象設計是一類編程方式,此編程方式的落地式需要使用類和目標來達到,因此,面向對象設計本身就是對類和目標的應用,今日給大家介紹一下python面向對象設計開發(fā)設計及本質特征,感興趣的小伙伴一起了解一下吧  序言  面向對象設計對新手而言不難理解但無法運用,盡管我們給大家匯總過面向對象戰(zhàn)略部署方式(定義類、創(chuàng)建對象、給目標發(fā)信息),可是看似簡單其實不簡單。大量程序編寫訓練與閱讀高質量的編碼有可...

    89542767 評論0 收藏0
  • C語言實現(xiàn)簡易動態(tài)電話簿&&文末提供源代碼下載

    摘要:導航前言功能函數(shù)結構設定菜單交互主函數(shù)通訊錄初始化新增聯(lián)系人查找聯(lián)系人刪除聯(lián)系人修改聯(lián)系人查看所有聯(lián)系人清空所有聯(lián)系人以名字排序所有聯(lián)系人結尾語前言本文將實現(xiàn)一個簡易的電話簿管理。信息包括名字,性別,電話號碼,年齡,住址。 ...

    蘇丹 評論0 收藏0

發(fā)表評論

0條評論

leiyi

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<