c語言中如何自定義結(jié)構(gòu)體、位段和枚舉

這篇文章主要介紹了c語言中如何自定義結(jié)構(gòu)體、位段和枚舉的相關(guān)知識,內(nèi)容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇c語言中如何自定義結(jié)構(gòu)體、位段和枚舉文章都會有所收獲,下面我們一起來看看吧。

創(chuàng)新互聯(lián)是一家專業(yè)提供平江企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為平江眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進行中。

結(jié)構(gòu)體類型創(chuàng)建:
struct Stu
{    char name[20];//名字
int age;//年齡
char sex[5];//性別
char id[20];//學(xué)號
}stu1,stu2;
結(jié)構(gòu)體的自引用:
struct Node
{    int data;
struct Node* next;
};//用到指針

結(jié)構(gòu)體的初始化:(可以整體初始化,但不可以整體賦值)
struct Stu        //類型聲明
{    char name[15];//名字
int age;      //年齡
};
struct Stu s = {"zhangsan", 20};//初始化

(重點)結(jié)構(gòu)體的內(nèi)存對齊:
首先得掌握結(jié)構(gòu)體的對齊規(guī)則: 1. 第一個成員在與結(jié)構(gòu)體變量偏移量為0的地址處。 2. 其他成員變量要對齊到某個數(shù)字(對齊數(shù))的整數(shù)倍的地址處。

  1. 結(jié)構(gòu)體總大小為最大對齊數(shù)(每個成員變量都有一個對齊數(shù))的整數(shù)倍。 4. 如果嵌套了結(jié)構(gòu)體的情況,嵌套的結(jié)構(gòu)體對齊到自己的最大對齊數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整體大小就是 所有最大對齊數(shù)(含嵌套結(jié)構(gòu)體的對齊數(shù))的整數(shù)倍。
    為什么要內(nèi)存對齊:

    1. 平臺原因(移植原因): 不是所有的硬件平臺都能訪問任意地址上的任意數(shù)據(jù)的;某些硬件平臺只能在某些地址 處取某些特定類型的數(shù)據(jù),否則拋出硬件異常

  2. 性能原因: 數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地在自然邊界上對齊。 原因在于,為了訪問未對齊的內(nèi)存,處理 器需要作兩次內(nèi)存訪問;而對齊的內(nèi)存訪問僅需要一次訪問。
    (用空間換取時間的做法)
    結(jié)構(gòu)體傳參:
    函數(shù)傳參的時候,參數(shù)是需要壓棧,會有時間和空間上的系統(tǒng)開銷。
    如果傳遞一個結(jié)構(gòu)體對象的時候,結(jié)構(gòu)體過大,參數(shù)壓棧的的系統(tǒng)開銷比較大,所以會導(dǎo)致性能的下降。
    結(jié)論: 結(jié)構(gòu)體傳參的時候,要傳結(jié)構(gòu)體的地址。
    位段:(可以調(diào)整結(jié)構(gòu)體大?。?br/>1.位段的成員必須是 int、unsigned int 或signed int 或者char。
    2.位段的成員名后邊有一個冒號和和一個數(shù)字。
    struct A
    {    int _a:2;  //數(shù)字表示占的bit位數(shù)
    int _b:5;  
    int _c:10;  
    int _d:30;
    };
    位段的內(nèi)存分配

    1. 位段的成員可以是 int unsigned int signed int 或者是 char (屬于×××家族)類型 2. 位段的空間上是按照需要以4個字節(jié)( int )或者1個字節(jié)( char )的方式來開辟的。 3. 位段涉及很多不確定因素,位段是不跨平臺的,注重可移植的程序應(yīng)該避免使用位段。
      位段大?。?br/>. 當(dāng)一個結(jié)構(gòu)包含兩個位段,第二個位段成員比較大,無法容納于第一個位段剩余的位時,是舍棄剩余的 位還是利用,這是不確定的。(如果后面空間足夠直接后補,如果不夠,另外尋找一片足夠的空間)(返回的是新地址的首地址)
      枚舉:
      enum Day//星期
      {    Mon,
      Tues,  
      Wed,  
      Thur,  
      Fri,  
      Sat,  
      Sun
      };

這些可能取值都是有值的,默認(rèn)從0開始,一次遞增1,當(dāng)然在定義的時候也可以賦初值。 只能枚舉常量賦給枚舉變量??梢灾苯訌?fù)制。值間斷遞增。
枚舉大?。?br/>加在一起
聯(lián)合:

聯(lián)合也是一種特殊的自定義類型 這種類型定義的變量也包含一系列的成員,特征是這些成員公用同一塊空間(所以 聯(lián)合也叫共用體)。
union Un2
{    short c[7];
int i;
};
聯(lián)合大小:
聯(lián)合的大小至少是最大成員的大小。 當(dāng)最大成員大小不是最大對齊數(shù)的整數(shù)倍的時候,就要對齊到最大對齊數(shù)的整數(shù)倍。

關(guān)于“c語言中如何自定義結(jié)構(gòu)體、位段和枚舉”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“c語言中如何自定義結(jié)構(gòu)體、位段和枚舉”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

本文名稱:c語言中如何自定義結(jié)構(gòu)體、位段和枚舉
轉(zhuǎn)載源于:http://bm7419.com/article30/jjdppo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司、品牌網(wǎng)站設(shè)計搜索引擎優(yōu)化、云服務(wù)器、網(wǎng)站制作、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司