C語言小結--結構體
1 什麼是結構體
結構體是一種聚合資料型別,它是一種資料元素的聚合。比如我們描述一個學生時,要求有他的姓名、學校、分數等等資訊,在之前的處理中,我們通常會使用單獨的資料型別來描述。比如,定義一個字串陣列來描述姓名char name[20] = "xiaoming"
,定義一個浮點數來描述成績float f = 96.5
等等。但是這種做法有個缺點。所有的這些資料都是為了描述一個學生來定義的,但是它們又沒有什麼關聯。有同學說,我們可以使用陣列來定義一個學生,但是陣列也有缺陷,一次只能定義一種資料型別。放在這裡顯然也不合適。所有,一種新的資料型別將被介紹:結構體。
所謂結構體就是將一些已知的資料型別放在一起來定義的一種資料型別。結構體並沒有創造出新的資料型別,這點要搞清楚。C語言的結構體和其他高階語言的類有點相似的概念,可以完成對一種事物的抽象。但是C語言的結構體又不具備高階語言的繼承和多型的功能。
1.1 結構體宣告和定義
和其他型別變數的宣告一樣,結構體也有自己的關鍵字:struct
就像我們定義一個整形變數a一樣int a
,定義一個結構體變數b同樣簡單:
struct
{
char name[20];
float score;
}XiaoMing;
這樣,我們就定義了一個結構體變數XiaoMing。這個變數包含兩個成員,一個是char型的名字,一個是float型的分數,關於結構體的使用我們放在後面介紹。
但是這樣定義一個結構體也有些問題,比如我們的程式中有大量的結構體需要使用,每個結構體我們都這樣定義,數量一多,就完全的亂掉了,根本無法維護和擴充套件。所以,有了下面這種宣告和定義來解決這個問題。
struct _Student
{
char name[20];
float score;
};
struct _Student XiaoMing;
在宣告中給這個結構體加上一個“_Student”的標籤後,我們在需要定義的結構體變數的地方可以這樣來定義:struct _Student XiaoMing;
。 這樣我們就一目瞭然,原來這個結構體定義的是關於一個學生。
更常見的使用方法是在宣告中用typedef 來給結構體起一個別名,這樣在定義一個結構體變數時,能使定義看上去更簡單明瞭。
typedef struct _Student
{
char name[20 ];
float score;
} Student;
Student XiaoMing;
通過上面方式的宣告,我們在使用該結構體定義變數時將會變得非常簡單:Student XiaoMing; Student XiaoHua;
怎麼樣,是不是和定義一個整型變數aint a;
一樣簡單。但是注意我們並沒有建立一個新的型別Student,而是使用typedef來重新命名了一下而已。這點非常重要。
1.2 結構體的使用
通過上一節的討論,我們已經可以宣告和定義一個結構體了,但是結構體怎麼使用呢?這裡要引入一個新的操作符“.”,通常我們也叫做點操作符。這個操作符是專門用來訪問結構體成員的。比如,我們定義的struct _Stuent XiaoMing;
要使用其中的變數可以這樣來使用:XiaoMing.score = 98.5; strncpy("XiaoMing", XiaoMing.name, 8);
在結構體指標中,我們使用‘->’來操作結構體指標所指向的變數。還是用上述的例子來說明:我們定義的struct _Stuent * XiaoMing;
對其所指的變數可以這樣來使用:XiaoMing->score = 98.5; strncpy("XiaoMing", XiaoMing->name, 8)
。
結構體在C語言程式設計中佔用很重要的篇幅,尤其是結構體和指標結合起來的程式設計。同時,結構體也是實現C語言面向物件的程式設計思想的基礎,在我們日常開發中,經常將一個對應的需求抽象為一個結構體,然後進行處理。比如:我們需要對一個學生的綜合素質進行評定,可以這樣來實現:
typedef (float)(* average_socres)(float * socres_array, unsigned int nums);
typedef struct _Student
{
float math_scores; //數學成績
float english_scores; //語文成績
float physical_scores; //物理成績
average_socres av_socres; //平均成績指標函式
}Student;
這裡只是舉一個淺顯的例子,可能不是很恰當。歡迎指正…..
具體的實現,後續部落格再詳細介紹。。。