日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

C语言中的自定义类型

發(fā)布時(shí)間:2024/7/23 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言中的自定义类型 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C語(yǔ)言中的自定義類型

(一)結(jié)構(gòu)體

  • 結(jié)構(gòu)體的聲明
    結(jié)構(gòu)體是一些值的集合,這些值稱為成員變量,結(jié)構(gòu)體的成員可以是不同類型的變量;
  • 結(jié)構(gòu)體的聲明
  • struct tag { member-list; }variable-list;
  • 特殊聲明
    在聲明結(jié)構(gòu)體的時(shí)候可以不完全的聲明,稱為匿名結(jié)構(gòu)體,例如:
  • struct {char a;int b;float c;}x;
  • 結(jié)構(gòu)體的自引用
    結(jié)構(gòu)體的自引用使用指針
    示例代碼如下:
  • struct Node { int data; struct Node* next; };
  • 結(jié)構(gòu)體變量的定義和初始化
  • struct Point {int x;int y; }p1; struct Point p2; struct Point p3={x,y}; struct Stu {char name[15];int age;};struct Stu s={"zhangsan",20};struct Node { int data; struct Point p; struct Node* next; }n1 = {10, {4,5}, NULL}; //結(jié)構(gòu)體嵌套初始化 struct Node n2 = {20, {5, 6}, NULL};//結(jié)構(gòu)體嵌套初始化
  • 結(jié)構(gòu)體內(nèi)存對(duì)齊
    結(jié)構(gòu)體內(nèi)存對(duì)齊的規(guī)則:
    第一個(gè)成員在與結(jié)構(gòu)體變量偏移量為0的地址處。
    其他成員變量要對(duì)齊到某個(gè)數(shù)字(對(duì)齊數(shù))的整數(shù)倍的地址處。
    比特科技
    對(duì)齊數(shù) = 編譯器默認(rèn)的一個(gè)對(duì)齊數(shù) 與 該成員大小的較小值。
    結(jié)構(gòu)體總大小為最大對(duì)齊數(shù)(每個(gè)成員變量都有一個(gè)對(duì)齊數(shù))的整數(shù)倍。
    如果嵌套了結(jié)構(gòu)體的情況,嵌套的結(jié)構(gòu)體對(duì)齊到自己的最大對(duì)齊數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整體大小就是
    所有最大對(duì)齊數(shù)(含嵌套結(jié)構(gòu)體的對(duì)齊數(shù))的整數(shù)倍。
    為什么存在內(nèi)存對(duì)齊?
    什么存在內(nèi)存對(duì)齊?
    大部分的參考資料都是如是說(shuō)的:
    平臺(tái)原因(移植原因): 不是所有的硬件平臺(tái)都能訪問(wèn)任意地址上的任意數(shù)據(jù)的;某些硬件平臺(tái)只能在某些地址
    處取某些特定類型的數(shù)據(jù),否則拋出硬件異常。
    性能原因: 數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地在自然邊界上對(duì)齊。 原因在于,為了訪問(wèn)未對(duì)齊的內(nèi)存,處理
    器需要作兩次內(nèi)存訪問(wèn);而對(duì)齊的內(nèi)存訪問(wèn)僅需要一次訪問(wèn)。
    總體來(lái)說(shuō):
    結(jié)構(gòu)體的內(nèi)存對(duì)齊是拿空間來(lái)?yè)Q取時(shí)間的做法。
    修改默認(rèn)對(duì)齊參數(shù):
    #pragma pack(n)
    n為2^n;
  • (二)位段

    什么是位段
    位段的聲明和結(jié)構(gòu)是類似的,有兩個(gè)不同:
    1.位段的成員必須是int、unsigned int或 signed int
    2.位段的成員名后邊有一個(gè)冒號(hào)和一個(gè)數(shù)字;
    例如:

    struct A {int _a:2;int _b:5;};

    位段的內(nèi)存分配:
    位段的成員可以是 int unsigned int signed int 或者是 char (屬于整形家族)類型
    位段的空間上是按照需要以4個(gè)字節(jié)( int )或者1個(gè)字節(jié)( char )的方式來(lái)開(kāi)辟的。
    位段涉及很多不確定因素,位段是不跨平臺(tái)的,注重可移植的程序應(yīng)該避免使用位段。
    3.位段的跨平臺(tái)問(wèn)題:
    int位段被當(dāng)成有符號(hào)數(shù)還是無(wú)符號(hào)數(shù)是不確定的。
    位段中最大位的數(shù)目不能確定。
    位段中的成員在內(nèi)存中從左往右還是從右往左分配標(biāo)準(zhǔn)尚未定義。
    當(dāng)一個(gè)結(jié)構(gòu)體包含兩個(gè)位段,第一個(gè)位段成員比較大,無(wú)法容納于第一個(gè)位段時(shí),是舍棄剩余位置還是利用,這是不確定的。

    (二)枚舉

  • 枚舉
    枚舉顧名思義就是一一列舉。
    把可能的取值一一列舉。
  • 枚舉類型的定義
  • enum Day { mon, thes, wed, thur, fri, sat, sun }

    上定義的 enum Day , 是枚舉類型。 {}中的內(nèi)容是枚舉類型的可能取值,也叫 枚舉常量
    這些可能取值都是有值的,默認(rèn)從0開(kāi)始,一次遞增1,當(dāng)然在定義的時(shí)候也可以賦初值。
    3. 枚舉的優(yōu)點(diǎn):
    增加代碼的可讀性和可維護(hù)性
    和#define定義的標(biāo)識(shí)符比較枚舉有類型檢查,更加嚴(yán)謹(jǐn)。
    防止了命名污染(封裝)
    便于調(diào)試
    使用方便,一次可以定義多個(gè)常量。

    (三)聯(lián)合

  • 聯(lián)合類型的定義
    聯(lián)合也是一種特殊的自定義類型 這種類型聯(lián)合也叫共用體)。 比如:聯(lián)合類型的定義聯(lián)合也是一種特殊的自定義類型 這種類型定義的變量也包含一系列的成員,特征是這些成員公用同一塊空間(聯(lián)合也叫共用體)。 比如:
  • //聯(lián)合類型的聲明 union Un { char c; int i; }; //聯(lián)合變量的定義 union Un un; //計(jì)算連個(gè)變量的大小 printf("%d\n", sizeof(un))
  • 聯(lián)合的特點(diǎn)
    聯(lián)合的成員是共用同一塊內(nèi)存空間的,這樣一個(gè)聯(lián)合變量的大小,至少是最大成員的大小(因?yàn)槁?lián)合至少得有能力保存最大的那個(gè)成員)
  • 聯(lián)合大小的計(jì)算
    當(dāng)最大成員大小不是最大對(duì)齊數(shù)的整數(shù)倍的時(shí)候,就要對(duì)齊到最大比如:聯(lián)合大小的計(jì)算聯(lián)合的大小至少是最大成員的大小。當(dāng)最大成員大小不是最大對(duì)齊數(shù)的整數(shù)倍的時(shí)候,就要對(duì)齊到最大對(duì)齊數(shù)的整數(shù)倍。
  • 總結(jié)

    以上是生活随笔為你收集整理的C语言中的自定义类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。