結構體
重點:
複合類型與結構體;
數據抽象;
一、複合類型與結構體
在實際問題中,一組數據往往具有不同的數據類型。例如,在學生登記表中,姓名應爲字符型;學號爲整型或者字符型;年齡爲整型,性別爲字符型等。顯然不能用一個數組來存放這一組數據。因爲數組各元素的類型和長度都必須一致,以便於編譯系統處理。爲了解決這個問題,C語言中給出了另一種構造數據類型——“結構(structrue)“或叫”結構體”。它相當於其它高級語言中的記錄。
”結構”是一種構造類型,它是由若干“成員”組成的。每一個成員可以是基本數據類型或者又是一個構造類型。
結構既然是一種“構造”而成的數據類型,那麼在說明和使用之前必須先定義它也就是構造它,如同在說明和調用函數之前要先定義函數一樣。
定義結構的形式:struct 結構名
{成員表列};
例:定義和訪問結構體
#include "stdafx.h"
int main()
{
struct complex_struct { double x,y;} z;
double x=3.0;
z.x=x;
z.y=4.0;
printf("struct value:z.x=%f z.y=%f\n",z.x,z.y);
getchar();
return 0;
}
注意,上例中變量x和變量z的成員x的名字並不衝突,因爲變量z的成員x只能通過表達式z.x來訪問,編譯器可以從語法上區分哪個x是變量x,哪個x是變量z的成員。結構體Tag也可以定義在全局作用域中,這樣定義的Tag在其定義之後的各函數中都可以使用。
結構體變量之間使用賦值運算符是允許的,用一個結構體變量初始化另一個結構體變量也是允許的。
二、數據抽象
數據抽象是指,只向外界提供關鍵信息,並隱藏其後臺的實現細節,即只表現必要的信息而不呈現細節。數據抽象是一種依賴於接口和實現分離的編程(設計)技術。
數據抽象分爲:複數運算層,複數存儲表示層。
這兩個稱爲抽象層,表示層在下,從底層往上層來看,複數越來越抽象了,把所有這些層組合在一起就是一個完整的系統。組合使得系統可以任意複雜,而抽象使得系統的複雜性是可以控制的,任何改動都只侷限在某一層,而不會波以及整個系統。
三、數據類型標誌
enum coordinate_type{RECTANGULAR, POLAR};
struct complex_struct{
enum coordinate_type t;
double a,b;
};
enum關鍵字的作用和struct關鍵字類似,把coordinate_type這個標識符定義爲一個標籤,struct complex_struct表示一個結構類型,而enum coordinate_type 表示一個枚舉類型。枚舉類型的成員常量,它們的值由編譯器自動分配,例如,定義了上面的枚舉類型之後,RECTANGULAR就表示常量0,POLAR表示常量1。
四、嵌套結構體
結構體也是一種遞歸定義:結構體的成員具有某種數據類型,而結構體本身也是一種數據類型。換句話說,結構體的成員可以是另一個結構體,即結構體可以嵌套定義。
例如,我們在複數的基礎上定義複平面上的線段:
struct segment{
struct complex_struct start;
struct complex_struct end;
};
初始化也可以嵌套,因此嵌套結構體可以嵌套地初始化,例如:
struct segment s={{1.0,2.0},{4.0,6.0}};
也可以平坦(Flat)地初始化。例如:
struct segment s={1.0,2.0,4.0,6.0};
甚至可以把兩種方式混合使用(這樣可讀性很差,應該避免):
struct segment s={{1.0,2.0},4.0,6.0};