在學習結(jié)構(gòu)體之前,你會很自然的想到使用如下的變量來描述
name,height,weight,strong,modfile
好了現(xiàn)在來給Kula和K分別進行描述,你就需要在變量名上加以區(qū)分對于Kula你有了
Kula_name, Kula_height, Kula_weight, Kula_strong, Kula_modfile
對于K,你有了
K_name, K_height, K_weight, K_strong, K_modfile
好,設(shè)想你現(xiàn)在要制作KOF2003了,我們需要一個函數(shù)根據(jù)這些信息在戰(zhàn)斗中評價兩位選手,這個函數(shù)看上去像是這樣
int value(char *name,int height,int weight,int strong,char *modfile);
當然在實際測試中一個人物的信息可能不止這幾個,也許他有30個之多,我相信你是不會寫一個有30個參數(shù)的函數(shù)的(除非你為Microsoft工作)
。更糟糕的是,如果由于版本更新發(fā)現(xiàn)30個參數(shù)里有15個是多余的,在修改了函數(shù)定義之后,你還要修改無數(shù)的不只位置函數(shù)調(diào)用。汗!
現(xiàn)在,結(jié)構(gòu)體來救你了(e文:the struct comes to rescue)。看看如何用結(jié)構(gòu)體定義一個拳皇人物吧。首先我們定義一個結(jié)構(gòu)體類型:
struct FIGHTER {
char *name; /*元素1*/
int height; /*元素2*/
int weight; /*元素3*/
int strong; /*元素4*/
char *modfile; /*元素5*/
} ;
這個類型叫FIGHTER他和你用的int在語法上是一樣,他們都是類型。正如你使用int聲明變量一樣,你可以用FIGHTER聲明變量。FIGHTER有一些
比int特殊的地方,他是結(jié)構(gòu)體。所以聲明變量時,你給跟TC提這件事(在FIGHTER前加上struct關(guān)鍵詞)。聲明變量的方法如下:
struct FIGHTER Kula,K,Iori,Athena;
好了,你定義了很多FIGHTER變量。那么如何使用他們呢。對于設(shè)置一個人物我們可以這樣:
Kula.height = 1.65;
Kula.weight = 49;
Kula.strong = 75;
這里,height,weight,strong是Kula內(nèi)的元素。這就好像同一規(guī)格的不同書包一樣。Kula是這種規(guī)格書包的一種,而height,weight,strong就
是書包里袋子的名稱。自然書包K里height袋子和書包Kula里height袋子是兩個完全獨立的袋子,他們互不干擾。
你注意到了Kula和height之間有一個點,專業(yè)一點的稱呼叫 成員運算符(member operator)。當然我還是叫她"點"。
現(xiàn)在回到value函數(shù)的問題,我們不再需要那么多參數(shù)了。我們只要
int value(struct FIGHTER fighter);
這樣,在評價Kula的時候我們使用的是value(Kula)而不是什么value(Kula_height,Kula_weight, ......,汗!);
一定會發(fā)現(xiàn)結(jié)構(gòu)對于描述一樣帶有很多屬性的東西有天生的優(yōu)越性。比如
struct POINT {
int x;
int y;
};
struct RECT {
int left;
int top;
int bottom;
int right;
};
.....
使用結(jié)構(gòu)體編程可以讓你盡快熟悉OOP(面向?qū)ο蟪绦蛟O(shè)計)。
不過,...嘻嘻,你沒覺得每次在聲明結(jié)構(gòu)體時的語法中有個struct在前面很不爽
struct RECT rt;
我想讓他像聲明int型一樣簡單,打個RECT rt就行了那多好。于是你就打了一個
RECT rt;
然后編譯器給了一個驚人的回答:
Declaration syntax error 定義語法錯誤。
希望沒有破滅!現(xiàn)在,typedef comes to rescue(c文:typedef來幫忙了)
記得我們可以用typedef定義類型別名吧,比如unsigned int太長了,不好打,我們用
typedef unsigned int UINT;
來定義和unsigned int的同義詞UINT,這樣一來unsigned int a 和 UINT a就是一回事了。現(xiàn)在來看看這個語法結(jié)構(gòu)。
typedef struct POINT PT;
呵呵,看到了吧PT和struct POINT 這么長的一個東西成了同義詞了。以后直接用PT就可以了比如struct POINT point就可以用PT point代替了
,爽吧!
其實,還有更爽的,我們把typedef和struct定義結(jié)合在一起。
typedef struct POINT {
int x;
int y;
} PT;
更簡單!這種做法是很多程序里慣用的。當然,我們用更好的方法給變量命名,國際上一般采用這樣的命名方法
typedef struct tagPOINT {
int x;
int y;
} POINT;
這樣我們就可以直接用 POINT pt1,pt2;定義POINT型的變量了。呵呵看起來是不是和int的語法一樣了。