自定義型別部分知識(結構體(位段) 列舉 聯合)

2021-08-17 20:37:30 字數 3100 閱讀 9927

1、陣列:陣列是相同型別的元素的集合,它的每個元素是通過下標引用或者指標間接訪問來選擇的。

2、結構體:結構體也是一些值的集合,這些值稱為它的成員,但是乙個結構體的各個成員可能具有不同的型別。

3、陣列元素可以通過下標訪問,這是因為陣列的長度相同。在結構體中由於結構體的成員可能是不同的型別、長度不同。所以我們不能使用下標來訪問,但是每個結構體的成員都有自己的名字,他們是通過名字訪問的。

在宣告結構體的,必須列出它包含是所有成員。這個列表包括每個成員的型別和名字。

語法為:

struct tag

//結構體標籤

variable

-list;//變數列表

例如:

struct

x;

這個宣告建立了乙個名叫x的變數,它包含三個成員:乙個整數、乙個字元、和乙個浮點數。

struct

y[20], *z;

這個宣告建立了y和z。y是乙個陣列,它包含了20個結構。z是乙個指標,它指向這個型別的結構。

結構體標籤:允許為成員列表提供乙個名字,可以在後續的宣告中使用。標籤允許多個宣告使用同乙個成員列表,並且建立同一種型別的結構。

例如:

struct ******

;

這個宣告把******標籤和這個成員的列表聯絡一起。這個宣告並沒有提供變數的列表。所以它並未建立任何變數。標籤標識了一種模式,用於宣告未來的變數,但無論是標籤還是模式本身都不是變數。

struct ****** x;

struct ****** y[20],*z;

這些宣告使用標籤來建立變數,現在x,y和z都是同一種型別的結構變數。

宣告結構體的時候還有一種良好的技巧是使用typedef建立一種新的型別,如下面的例子:

typedef

struct

******;

這個技巧和宣告乙個結構標籤的效果幾乎相同。

1、結構的初始化方式和陣列的初始化很相似。乙個位於一對花括號內部、由逗號分隔的初始值列表可用於結構各個成員的初始化。這些值根據結構成員列表的順序寫出。如果初始列表的值不夠,剩餘的結構成員將使用預設值進行初始化。

2、如果結構體 中包含了陣列或者結構成員,其初始化方式和多維陣列初始化方式一樣。

例如:

struct point

p1;//宣告型別的同時定義變數p1

struct point p2;定義結構體變數p2

//初始化:定義變數的同時賦初值

struct point p3 = ;

struct stu //型別宣告

;struct stu s = ;//初始化

struct node

n1 = ,null};//結構體巢狀初始化

struct node n2 = ,null};

首先得掌握結構體的對齊規則:

1、第乙個成員在與結構體變數偏移量為0的位址處。

2、其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。對齊數=編譯器預設的乙個對齊數與該成員大小的較小值。vs中預設的值是8 linux中的預設值為4。

3、結構體總大小為最大對齊數(每個成員變數除了第乙個成員都有乙個對齊數)的整數倍。

4、如果有巢狀結構體的情況,巢狀的結構體對齊自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍。

位段的宣告和結構是類似的,但是有兩個不同。

(1):位段的成員必須是 int、unsigned int或者signed int。

(2):位段的成員名後邊有乙個冒號和乙個整數,這個整數指定該位段所占用的位的數目。

struct a

printf("%d\n",sizeof(struct(a))

這就是乙個位段型別。

它列印出來的數字為8。為什麼會是8呢?你會不會說不對呀 明明是4個int應該是16呀。別著急我們分析分析

分析:在32位系統下乙個int型為4個位元組,也就是說有32個位元位。a占用2個,b占用5個,c占用10個。這三個一共加起來為17,因為d占用了30位所以很明顯乙個int是存放不下的,所以開闢了第二個int單獨放d。所以最終列印出8。

總結:位段跟結構體相比,位段可以達到同樣的效果,但是可以很好的節省空間,但是有跨平台的問題存在。

列舉顧名思義就是一 一枚舉。

列舉常量的取值預設是從0開始的。一次遞增1,當然在定義的時候也可以賦初值。

舉個例子:

enum color// 顏⾊色

;

列舉的優點:

1 、增加**的可讀性和可維護性。

2、很#define定義的識別符號⽐比較列舉有型別檢查,更更加嚴謹。

3 、防⽌止了了命名汙染(封裝)。

4 、便便於除錯。

5、 使用⽅便,一次可以定義多個常量量。

聯合也是⼀一種特殊的⾃自定義型別

這種型別定義的變數量也包含⼀一系列列的成員,特徵是這些成員公⽤用同⼀一塊空間(所以聯合也叫共⽤用

體)。

(1)聯合的特點:

聯合的成員是共⽤用同⼀一塊記憶體空間的,這樣⼀乙個聯合變數量的⼤大⼩小,⾄至少是最⼤大成員的⼤大⼩小

(因為聯合⾄至少得有能⼒力力儲存最⼤大的那個成員)。

例如:

union un

;union un un;

// 下⾯面輸出的結果是⼀一樣的嗎?

printf("%d\n", &(un.i));

printf("%d\n", &(un.c));

//結果是一樣的。

// 下⾯面輸出的結果是什什麼?

un.i = 0x11223344;

un.c = 0x55;

printf("%x\n", un.i);

如果你的電腦是小端的話 那麼輸出的結果是0x11223355。

聯合大小的計算

(1.)聯合的大小至少是最大成員的大小。

(2.)當最大成員大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍。

自定義型別 結構體 位段 列舉 聯合

include include include 1 結構體 結構是一些值的集合,這些值稱為結構體成員,結構體的每個成員可以是不同型別的變數 struct stu 結構體的自引用 struct node 錯誤的,結構體內不能包含結構體自身 struct node 正確 指標是四個位元組 結構體內存對齊...

自定義型別 結構體 位段 列舉 聯合

1 結構體基礎知識 定義 不同或相同型別元素的集合 宣告 直接上例子會更清楚 成員 可以是變數 陣列 指標甚至其它結構體成員。struct stu 分號不能丟特殊宣告 匿名結構體型別,並不建議省略結構體型別名,知道有這麼回事就好了 struct x 注意 有n個結構體就有n種型別,即使兩個結構體成員...

自定義型別 結構體,位段,列舉,聯

1 結構體 1 結構體的宣告 結構體中的每個成員可以是不同型別的變數 例如 描述乙個學生 struct stu 2 結構體的自引用 struct node 3 結構體變數的定義和初始化 宣告型別的同時定義變數p1 struct point p1 初始化 struct point p2 4 結構體內存...