自定義資料型別

mingren_1314發表於2020-11-14

自定義資料型別

結構體

結構體的宣告

結構體的基礎知識

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-DAjLKbxi-1605354993141)(D:\鳴人的筆記\3\1605190661396.png)]

結構的宣告

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-JALi56xp-1605354993142)(D:\鳴人的筆記\3\1605191015357.png)]

變數的宣告

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-beYAPnlC-1605354993143)(D:\鳴人的筆記\3\1605191268790.png)]

匿名結構型別

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-4Hf7naRO-1605354993145)(D:\鳴人的筆記\3\1605192048015.png)]

結構體的自引用

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-WX9stVjb-1605354993146)(D:\鳴人的筆記\3\1605192575895.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-aLEVWpEz-1605354993146)(D:\鳴人的筆記\3\1605192883047.png)]

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

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-cmtmR1ZP-1605354993147)(D:\鳴人的筆記\3\1605193052255.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-09HB0pFV-1605354993147)(D:\鳴人的筆記\3\1605193350880.png)]

結構體記憶體對齊

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-7i9fWFXJ-1605354993147)(D:/鳴人的筆記/3/1605234630851.png)]

在這裡插入圖片描述

第一,第一個成員在偏移量為0的地方,我們假設第一個成員的記憶體在第二行開始

第二,其他成員要對齊到對齊數的整數倍,對齊數的概念如上圖,因為int a的位元組是4,vs預設對齊數是8,所以在這裡對齊數是4,4的整數倍是4,所以int a在第五行開始,也就是紫色的地方

第三,同第二理char c2的對齊數是1,那麼它就在9行,此時這個結構體一共佔了9個位元組

最後,結構體的總大小是最大對齊數的整數倍,在這裡也就是4的最大整數倍,因為此時已經佔了9個了,所以是12,所以這個結構體大小是12

很明顯,上面的規則中第四個沒有使用到,那麼結構體巢狀的問題是什麼樣呢

在這裡插入圖片描述

首先計算出結構體s3的大小是16

結構體s4中巢狀了s3

第一,結構體s4中第一個成員是char型別,佔一個位元組,如右上藍色

第二,巢狀的結構體對齊到自己的最大對齊數的整數倍,s3中最大對齊數是8,整數倍是8,所以從第八個位置開始,s3的大小已經計算出是16,佔16個位元組大小

第三,double型的佔8個位元組,所以向下佔8個位置,如右上紫色

最後,可以看出一共佔了32個位元組(中間紅色的是被浪費的)

但結構體的整體大小是最大對齊數(含巢狀結構體)的整數倍,結構體s4中的最大對齊數是結構體s3,也就是16,32是16的整數倍,所以結構體s4的大小是32

有的人可能會好奇,VS預設對齊數是8,那麼其他編譯器呢。這裡如果其他編譯器沒有預設對齊數,那麼該成員大小的最小值就是對齊數

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-NKIeUlNC-1605354993149)(D:/鳴人的筆記/3/1605245600438.png)]

那麼記憶體對齊會浪費空間為什麼要記憶體對齊呢

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-1dErJJkG-1605354993149)(D:/鳴人的筆記/3/1605245650175.png)]

那在設計結構體的時候,既要滿足對齊,又要節省空間,應如何做

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-RlNgVygD-1605354993149)(D:/鳴人的筆記/3/1605246348706.png)]

修改預設對齊數

#pragma pack(n)

這裡的n就是我們自己修改的預設對齊數

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-tWHg349y-1605354993149)(D:/鳴人的筆記/3/1605246822183.png)]

結構體成員偏移量

offsetof是個巨集,不是函式

offsetof–>標頭檔案#include<stddef.h>

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-clqqfHT7-1605354993150)(D:/鳴人的筆記/3/1605247214687.png)]

結構體傳參

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-O8WoXoZs-1605354993151)(D:/鳴人的筆記/3/1605250399355.png)]

很顯然say2傳參方式更好,原因:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-itv4b7SY-1605354993151)(D:/鳴人的筆記/3/1605250425489.png)]

位段

什麼是位段

在這裡插入圖片描述

位段的記憶體開闢

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-MDaHuj3r-1605354993151)(D:/鳴人的筆記/3/1605252206748.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-ACKbktUq-1605354993151)(D:/鳴人的筆記/3/1605252434523.png)]

一次開闢一個整形空間,這個整形空間4個位元組,32個bite位,a需要2個,b需要5個,c需要10個,這一個空間一共32個,但是已經使用了17個,剩下15個,不夠d使用了,那麼前面15個bite位全都丟掉,重新開闢一個整形空間,也就是4個位元組,32個bite位,然後使用30個bite位給d,剩下兩個丟掉,也就是說,這個位段一共使用了8個位元組

位段就是為了節省空間存在的

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-bv9RwNSP-1605354993152)(D:/鳴人的筆記/3/1605346060749.png)]

結構體的話要開闢四個位元組空間,但是位段只需要三個位元組空間

位段的弊端

位段不能跨平臺,可移植程式應避免使用位段

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-c70mdTVr-1605354993153)(D:/鳴人的筆記/3/1605346248850.png)]

列舉

列舉的基本概念及使用

列舉也就是一一列舉

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-4w1xd0u8-1605354993154)(D:/鳴人的筆記/3/1605348562683.png)]

在這裡插入圖片描述

列舉的優點

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-gwGDJvqg-1605354993155)(D:/鳴人的筆記/3/1605349075331.png)]

聯合-聯合體(共用體)

聯合型別的定義

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-dnCnNBAI-1605354993155)(D:/鳴人的筆記/3/1605349614539.png)]

聯合的特點

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-8YEZgKb7-1605354993155)(D:/鳴人的筆記/3/1605349545867.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-lYibQPtI-1605354993155)(D:/鳴人的筆記/3/1605349506597.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-NvoKLGoq-1605354993155)(D:/鳴人的筆記/3/1605349896300.png)]

判斷計算機的大小端儲存方式

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-i3gsFYyg-1605354993156)(D:/鳴人的筆記/3/1605350275789.png)]

所以如果想要判斷儲存方式(比如int a的儲存方式)是小端還是大端,就可以看第一個位元組(一個整型裡有4個位元組)是不是1

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-nXfiG5vh-1605354993156)(D:/鳴人的筆記/3/1605350730397.png)]

但這種方法不太好,我們可以自己封裝一個函式

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-k55SFTPl-1605354993157)(D:/鳴人的筆記/3/1605350852756.png)]

也可以利用我們剛學到的聯合體的知識解決

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-glR4OMMD-1605354993157)(D:/鳴人的筆記/3/1605352290295.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-5cxbKX0I-1605354993158)(D:/鳴人的筆記/3/1605351628909.png)]

聯合大小的計算

在這裡插入圖片描述

在這裡插入圖片描述


作者:呂文康
學校:山東第一醫科大學
2020年11月14日

相關文章