C结构体应用全攻略
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在学习结构体之前,你会很自然的想到使用如下的变量来描述:
name, height, weight, strong, modfile。
好了,现在来给Kula和K分别进行描述,你就需要在变量名上加以区分。对于Kula你有了
Kula_name, Kula_height, Kula_weight, Kula_strong, Kula_modfile 对于K,你有了
K_name, K_height, K_weight, K_strong, K_modfile
好,设想你现在要制作KOF2003了,我们需要一个函数根据这些信息在战斗中评价两位选手,这个函数看上去像是这样
int value(char *name, int height, int weight, int strong, char *modfile);
当然在实际测试中一个人物的信息可能不止这几个,也许他有30个之多,我相信你是不会写一个有30个参数的函数的(除非你为Microsoft工作)。更糟糕的是,如果由于版本更新发现30个参数里有15个是多余的,在修改了函数定义之后,你还要修改无数的不只位置函数调用。汗!
现在,结构体来救你了(e文:the struct comes to rescue)。看看如何用结构体定义一个拳皇人物吧。首先我们定义一个结构体类型:
struct FIGHTER {
char *name; /*元素1*/
int height; /*元素2*/
int weight; /*元素3*/
int strong; /*元素4*/
char *modfile; /*元素5*/
};
这个类型叫FIGHTER,他和你用的int在语法上是一样,他们都是类型。正如你使用int声明变量一样,你可以用FIGHTER声明变量。FIGHTER有一些比int 特殊的地方,他是结构体。所以声明变量时,你给跟TC提这件事(在FIGHTER 前加上struct关键词)。声明变量的方法如下:
struct FIGHTER Kula, K, Iori, Athena;
好了,你定义了很多FIGHTER变量。那么如何使用他们呢。对于设置一个人物我们可以这样:
Kula.height = 1.65;
Kula.weight = 49;
Kula.strong = 75;
这里,height,weight,strong是Kula内的元素。这就好像同一规格的不同书包一样。Kula是这种规格书包的一种,而height,weight,strong就是书包里袋子的名称。自然书包K里height袋子和书包Kula里height袋子是两个完全独立的袋子,他们互不干扰。
你注意到了Kula和height之间有一个点,专业一点的称呼叫成员运算符(member operator)。当然我还是叫她"点"。
现在回到value函数的问题,我们不再需要那么多参数了。我们只要
int value(struct FIGHTER fighter);
这样,在评价Kula的时候我们使用的是value(Kula)而不是什么
value(Kula_height, Kula_weight, ......, 汗!);
一定会发现结构对于描述一样带有很多属性的东西有天生的优越性。比如 struct POINT {
int x;
int y;
};
struct RECT {
int left;
int top;
int bottom;
int right;
};
.....
使用结构体编程可以让你尽快熟悉OOP(面向对象程序设计)。
不过,...嘻嘻,你没觉得每次在声明结构体时的语法中有个struct在前面很不爽
struct RECT rt;
我想让他像声明int型一样简单,打个RECT rt就行了那多好。于是你就打了一个
RECT rt;
然后编译器给了一个惊人的回答:
Declaration syntax error 定义语法错误。
希望没有破灭!现在,typedef comes to rescue(c文:typedef来帮忙了)记得我们可以用typedef定义类型别名吧,比如unsigned int太长了,不好打,我们用
typedef unsigned int UINT;
来定义和unsigned int的同义词UINT,这样一来unsigned int a 和 UINT a就是一回事了。现在来看看这个语法结构。
typedef struct POINT PT;
呵呵,看到了吧PT和struct POINT 这么长的一个东西成了同义词了。以后直接用PT就可以了比如struct POINT point就可以用PT point代替了,爽吧!
其实,还有更爽的,我们把typedef和struct定义结合在一起。
typedef struct POINT {
int x;
int y;
} PT;
更简单!这种做法是很多程序里惯用的。当然,我们用更好的方法给变量命名,国际上一般采用这样的命名方法
typedef struct tagPOINT {
int x;
int y;
} POINT;
这样我们就可以直接用 POINT pt1, pt2;定义POINT型的变量了。呵呵看起来是不是和int的语法一样了。
一、结构体入门——定义与成员
1. 结构定义
在C中,结构也是一种数据类型,可以使用结构变量,因此,像其它类型的变量一样,在使用结构变量时要先对其定义。
定义结构变量的一般格式为:
struct 结构名
{
类型变量名;
类型变量名;
...
} 结构变量;
结构名是结构的标识符不是变量名。