C語言入門第十七篇,結構體、聯合體和枚舉

結構體是C語言很重要的概念,他是數據結構的關鍵。
基本性質
個人理解結構體是一種變量的集合體,他把變量放入了一個結構裏面,形成了一個結構體。我們先看看他的基本語法。
struct 結構體名
{
結構體
}
我們看上面的基本語法可以看出,我們需要給出結構體名和內部的結構體就能聲明一個結構體變量。上面的語法還不能表現真正結構體的屬性,我們來看看一個例子,我們需要定義一個學生的結構體,裏面存放學號,姓名,性別。

struct student{
	int num;
	char name[20];
	char sex[10];
}

這只是一個結構體的定義,我們需要使用這個結構體還需要聲明一個變量,方法如下:

struct student students;

students就是一個結構體變量。那麼怎麼使用這個變量呢?如下:

scanf("%d",&students.num);
scanf("%s",students.name);
scanf("%s",students.sex);

上面的代碼是我們對學號,姓名,性別進行輸入。可以看到我們在結構體中用點(.)來訪問結構體中的變量。可是我這樣只能輸入一個結構體,我有50個學生怎麼辦?
結構體數組
結構體是一個變量類型,如同整型,浮點型一樣,結構體同樣也有數組。怎樣聲明呢?

struct student students[50];

有了結構體數組我們就可以輸入50個學生了。這個數組可以像我們之前利用循環進行輸入,具體的例子如下:

int i;
for(i=0;i<50;i++){
	scanf("%d",&students[i].num);
	scanf("%s",students[i].name);
	scanf("%s",students[i].sex);
	}

這裏深入的講一下,結構體數組其實是數據結構中的順序鏈表,前面就講過數組是連續的一片內存地址,所以結構體數組在作爲鏈表的時候是連續的一片內存。與之對應的當然是隨機的內存地址實現的鏈表,而這樣的鏈表是利用指針實現的。這些知識如果是小白的話,瞭解一下就好了,我們後面會仔細的講他的原理和實現的方法,當然這些本來是數據結構的東西,所以強烈建議大家在看了這個入門後(雖然我不知道什麼時候能寫完哈哈哈,但是儘量能在這幾個月完成這個),去學習數據結構。
結構體指針
剛剛說到鏈表的另一種實現方法就是結構體指針。這一塊就比較複雜了,但是我在前面有足夠的鋪墊。希望大家這裏能夠明白,我暫時不講怎麼樣實現50個學生的鏈表,只是介紹一下結構體指針。
結構體指針比結構體數組要複雜一些,因爲如果我們聲明一個結構體指針的話,他是沒有足夠大的內存空間的,所以我們需要申請內存(我們在前一章講過數組申請內存)。我們來看看例子:

//#include<stdlib.h> 上一章忘了說了,申請內存需要stdlib.h這個頭文件
struct student *students;
students=(struct student *)malloc(sizeof(struct student));//申請內存
scanf("%d",students->num);
scanf("%s",students->name);
scanf("%s",students->sex);

這裏就是結構體指針的使用方法,申請內存的方法其實很簡單,前面的(struct student *)是後面申請的內存的類型強制轉換成結構體的類型,sizeof()函數就是計算student這個結構體需要多大的內存,最後賦值給students。結構體指針調用自己內部的元素時也不再用.(點)而是->這個符號
聯合體
聯合體和結構體語法差不多,只是他的關鍵字是union,struct和union的區別在於,union只使用一塊內存。什麼意思呢?前面我們看到結構體可以包含很多變量,union也差不多,但是union同時只能使用一個帶值變量。如下

union data{
	int i;
	float j;
	char k[10];
}

上面的這個聯合體我們只能給其中一個變量賦值,因爲他只有一塊內存(默認應該是取結構體佔用內存最大的那個變量的大小,作爲聯合體的內存大小,這個例子應該是k[10]這個數組的內存大小)。
聯合體我就不在細講了,主要的用法就是用聯合體來表示一個狀態,例如:我寫的一個程序有一個字段是來表示編碼的格式,因爲編碼只可能是一種格式,而我們可以用union寫很多格式的變量,但是用的時候只能用一個。
枚舉
這裏再講一下枚舉這個類型,也類似上面結構體和聯合體,枚舉類聲明過後會自帶自己的值,並且一直遞增上去。舉個例子:

enum week{MON,TUE,WED,THU,FRI,SAT,SUN};

申明一個枚舉變量和結構體差不多

enum week day;

這裏可以讓枚舉變量day等於枚舉裏面的任意一個值,例如day=MON,就是day=0,day=THU,就是day=3,依次遞增。
如果在什麼的時候對枚舉的值進行了賦值是什麼情況呢?

enum week{MON,TUE=2,WED,THU,FRI,SAT,SUN};

那麼MON=0,TUE=2,WED=3,THU=4……

總結
本篇介紹了結構體、聯合體和枚舉這三種變量的內容,他們只是一個變量的類型,我們需要掌握他的聲明和調用方式。還要熟悉結構體數組和結構體指針這兩個結構體以後會常常用到的東西。聯合體的話我用的比較少,但是還是要會,並且結構和聯合都可以嵌套使用(結構體裏面再加結構體或結構體裏面有聯合等等)。枚舉的話,我根本沒怎麼用,但是不能不知道這個類型。
練習
1.能否將我這篇所說的利用結構體數組和我給的零星的代碼,寫出輸入10個學生基本信息(學號,姓名,性別),並輸出。
ps:枚舉類型,引用了這篇博客的例子枚舉用法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章