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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言中的自定义类型

發布時間:2024/7/23 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言中的自定义类型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C語言中的自定義類型

(一)結構體

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

    什么是位段
    位段的聲明和結構是類似的,有兩個不同:
    1.位段的成員必須是int、unsigned int或 signed int
    2.位段的成員名后邊有一個冒號和一個數字;
    例如:

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

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

    (二)枚舉

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

    上定義的 enum Day , 是枚舉類型。 {}中的內容是枚舉類型的可能取值,也叫 枚舉常量
    這些可能取值都是有值的,默認從0開始,一次遞增1,當然在定義的時候也可以賦初值。
    3. 枚舉的優點:
    增加代碼的可讀性和可維護性
    和#define定義的標識符比較枚舉有類型檢查,更加嚴謹。
    防止了命名污染(封裝)
    便于調試
    使用方便,一次可以定義多個常量。

    (三)聯合

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

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。