自定義資料型別
- 結構體基礎知識
- 結構體進階知識
- 結構體計算大小
- 列舉基礎知識
- 聯合體
- 一些小結和建議
- 寫在最后的話
結構體基礎知識
首先結構體的出現是因為我們使用C語言的基本型別無法滿足我們的需求,比如我們要描述一本書,就需要書名,作者,價格,出版社等等一系列的屬性,無疑C語言的基本資料型別無法解決,所以就出現了最重要的自定義資料型別,結構體,
首先我們創建一個書的結構體型別來認識一下
struct Book
{
char name[20];
char author[20];
int price;
};
首先是struct是結構體關鍵字,用來告訴編譯器你這里宣告的是一個結構體型別而不是其他的東西,然后是Book是結構體標簽,而關鍵字加標簽就是你結構體型別的名字,即struct Book 是你結構體型別的名字,然后看到結構體里面的內容,即大括號里面的內容,有兩個字符陣列和一個整型變數,一個陣列用來存放書的名字,一個陣列用來存放書的作者,整型變數用來存放書的價格,在型別宣告中需要多少變數就放入多少變數,需要什么變數就放入什么變數,而這些變數就是結構體的成員變數,成員變數可以是不同的型別,注意,結構體宣告的末尾分號不可省略,到此我們已經有了基本的認識,接下來我們來使用一下結構體型別,既然是型別,那么肯定就可以拿來創建變數,我們就拿上面那個描述書的結構體型別試一下

可以看到使用規則和基本資料型別之類的并無太大區別,唯一區別就是結構體初始化一定要用大括號將初始化的內容括起來,如果不是初始化那么就需要先訪問他的成員才能一一賦值,這里我們是在創建結構體的時候對它進行了初始化,放入了一些資料,小伙伴們能夠清楚的看到螢屏上輸出了這些資料,其中通過結構體變數訪問結構體成員的時候使用了點號. 這個點號是結構體成員訪問運算子,通過它我們就可以拿到結構體的成員,看完之后小伙伴們最好是自己也敲一下試試,代碼能力是練出來的,初學時一定要多敲多練,到此結構體基礎知識我們就介紹完了,接下來我們來進階一下,
結構體進階知識
首先結構體是可以嵌套定義的,像下面這樣



結構體計算大小
結構體在分配記憶體的時候,會發生結構體記憶體對齊,對齊規則如下:
- 第一個成員在與結構體變數偏移量為0的地址處,
- 其他成員變數要對齊到某個數字(對齊數)的整數倍的地址處,
- 結構體總大小為最大對齊數(每個成員變數都有一個對齊數)的整數倍,
- 如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含嵌套結構體的對齊數)的整數倍,
知道了規則我們來用一下,下面這個結構體的大小不考慮對齊的情況只需要6byte的空間就能存下所有資料,但是考慮到記憶體對齊就需要12byte的空間,這就足足多了一倍的空間,那么為什么還需要這個對齊的規則呢,原因大致有以下兩點:
- 平臺原因(移植原因): 不是所有的硬體平臺都能訪問任意地址上的任意資料的;某些硬體平臺只能在某些地址處取某些特定型別的資料,否則拋出硬體例外,
- 性能原因: 資料結構(尤其是堆疊)應該盡可能地在自然邊界上對齊, 原因在于,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問,
struct S1
{
char c1;//1 byte
int i;//4byte
char c2;//1byte
};
printf("%d\n", sizeof(struct S1));

總的來說,結構體的記憶體對齊是拿空間來換取時間的做法,結構體就介紹的差不多了,下面我們來看看列舉
列舉基礎知識
列舉顧名思義就是把所有的可能性 一 一 列舉出來,比如說一個星期分為星期一,星期二到星期天七天我們就可以使用列舉
enum Day
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
和結構體一樣首先是列舉關鍵字enmu然后是列舉的標簽Day,然后是成員,但是和結構體不同的是,列舉的成員是常量,而且是整型常量,并且不賦值的話是有默認值,而且默認值是向下依次遞增1的,我們來看看就知道了

可以看到不主動賦值的情況下,下一個比上一個大1,并且第一個默認為0,看看賦值了的

列舉就這么簡單,接下來看看聯合體
聯合體
聯合體是由關鍵字union和標簽定義的,和結構體和列舉是一樣的定義方式,和前面兩個不一樣的是,一個聯合體只有一塊記憶體空間,這句話什么意思呢,就相當于只開辟最大的變數的記憶體,其他的變數都在那個變數占據空間(空間可以被重疊占用)看看下面的圖片



上面黑色和紅色的重疊部分就是共用的區域,兩個變數都能使用它,這個東西很少用的就不多講了,唯一記住的就是,聯合體可以求當前編譯環境是大端位元組序存盤模式還是小端位元組序存盤模式,至于怎么求,看看下面這個代碼,應該很好理解
#include<stdio.h>
union Un{
char ch;
int n;
};
int main()
{
union Un un;
un.n = 1;
//小端 01 00 00 00
//大端 00 00 00 01
if (un.ch == 1) {//取出第一個位元組的內容判斷
printf("小端");
}
else {
printf("大端");
}
return 0;
}
這個東西理解不了也沒啥關系,一般用不上,
一些小結和建議
1.盡量不要使用聯合體,因為一次修改會導致多個資料被修改,容易出現不可預料的問題.
2.結構體記憶體對齊一定要學會計算,雖然實際可能用不上,但是可能會面試中出現.
3.結構體中還有一個叫欄位的知識點,形式如下,這個東西現在用于傳輸資料,后端開發一般用不上,所以博主沒講,感興趣的小伙伴就自行百度了解一下吧

4.列舉一般搭配switch陳述句使用,可以提高代碼的可讀性,
寫在最后的話
由于本人水平有限,文章難免有表達不清或表述錯誤的地方,歡迎小伙伴們留言私信指出,博主會及時修改,好了,本篇博客就到此結束了,希望對小伙伴們有所幫助,我們下篇博客見
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/283030.html
標籤:AI
上一篇:Everything(電腦檔案即時搜索) 徹底幫你告別搜索檔案還需要等待的問題
下一篇:2020 泰迪杯 C 題
