天天看點

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:枚舉類型,引用了這篇部落格的例子枚舉用法

繼續閱讀