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

2021-10-07 09:36:24 字數 2576 閱讀 3411

1、結構體

(1)結構體的宣告

結構體中的每個成員可以是不同型別的變數

例如:描述乙個學生

struct stu

;

(2)結構體的自引用

struct node

;

(3)結構體變數的定義和初始化

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

struct point

p1;

初始化

struct point p2=;
(4)結構體內存對齊

計算機訪問記憶體的基本單位是位元組,計算機能任意讀取記憶體中的任何乙個位元組,計算機因為硬體設計的原因,讀取資料時必須從特定要求的位置開始讀取。

結構體內存對齊的本質:用空間換取時間 

結構體的對齊規則:

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

2>除了第乙個成員之外的其他成員變數對齊到某個數字(對齊數)的整數倍的位址處,即就是該變數的起始偏移量能夠整除當前變數的對齊數

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

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

舉例:

struct s1

;printf("%d\n", sizeof(struct s1));

分析:

(5)修改預設對齊數

#include#pragma pack(1)

struct s1

;

#pragma pack()設定對齊數

(6)結構體傳參

結構體傳參時,要傳結構體的位址

#include#includestruct s

;struct s s = , 1000 };

void print(struct s* ps)

int main()

2、位段位段的成員必須是int,unsigned int ,signed int  或 char型別

位段的成員名後邊有乙個冒號和乙個數字

位段的空間上是按照需要以4個位元組(int)或者1個位元組(char)的方式來開闢的

位段是不跨平台的

例如:

struct a

;

位段的大小是受平台影響的,位段的空間分配採用「壓縮儲存」方式,如果剩下的位元位數目能夠容納當前變數,大家就擠一擠;如果不能,則重新開闢 

位段a的空間分配如圖所示:

位段a只開闢兩個整形空間,大小為8個位元組 

執行結果如圖:

3、列舉

(1)列舉

列舉型別的本質是int

例子:

enum day

enum day是列舉型別,{}中的內容是列舉型別的可能取值,也叫列舉常量。這些 可能取值預設從0開始,一次遞增1,在定義時也可以賦初值。

例如:

(2)列舉與#define定義常量

列舉是一種型別,在編譯時會進行型別檢查;

巨集是基於替換原則,在這個過程中並不進行任何檢查工作

巨集的應用場景》列舉 

4、聯合(共用體)

聯合也是一種特殊的自定義型別,這種型別定義的變數也包含一系列的成員,特徵是這些成員共用同一塊空間。

例如:

聯合體本身的大小並不是把所有的型別加起來的大小,常規而言,聯合體的大小是由聯合體內最大元素的大小覺得的,決定了之後,所有元素共享空間。

在使用union時,一次只會訪問乙個元素。

聯合體的宣告:

union un

;

聯合變數的定義:

union un un;
計算聯合變數的大小:

聯合體也要考慮記憶體對齊的問題,聯合體的最終大小要能整除聯合體內最大對齊數 

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

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

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

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

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

結構體常用於資料的大體模板相同,但具體的內容不同。例如 學生的資訊都包括學號,姓名,年齡等資訊,但是每個學生的資訊的內容不同。這時就要用到結構體的建立。1.定義結構體變數 以學生資訊為例 struct stu student 也可以用struct stu student 來定義結構體變數。當然也可以...