结构可以理解为将几种元素组合起来的工具。例如:date结构
struct date
{
int month;
int day;
int year;
}
date结构定义了三个整型元素,分别名为month,day,year。其实date的定义在语言中定义了新类型,以后就可以将变量声明为struct date类型,例如:
struct date today;
struct date purchase;
或者可以在同一行定义中包含一个名为purchaseDate的同类型变量。
不同于int,float,和char变量,处理结构变量需要特殊的语法。通过变量名称,在之后加上句点来访问结构成员。例如:
today.day = 21;
注意变量名,句点和成员名称之间不允许出现空格。
当我们在访问对象的属性的时候也使用句点操作符,所以当遇到句点操作符,编译器会确定句点操作符的左边是对象还是结构,然后进行相应的处理。
1.结构的初始化
初始化结构与初始化数组类似,将元素列在一对花括号中,元素之间以逗号隔开。例如:
struct date today = {7 , 2, 2011};
和数组初始化一样,列出值可以少于结构体中包含的元素个数。例如:
struct date today = {7};
将today.month 初始化为7,但是没有给today.day或者today.year赋值。在这种情况下,它们的默认初始值是未定义的。
在初始化列表中,用下面的表达式
.member = value可以以任意顺序初始化结构中指定的成员,例如:
struct date today = { .month = 7, .day = 2, .year = 2011};
和
struct date today = { .year = 2011};
2.结构中的结构
可以定义一个结构,他本身包含其他结构作为自己的一个或多个成员,或者可以定义包含数组的结构。
Apple的CGGeometry.h头文件是由typedef定义的:
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
struct CGSize{
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
struct CGRect{
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
现在声明一个CGPoint变量并且把成员x设置为100和成员y设置为200,可以编写如下代码:
CGPoint startPt;
startPt.x = 100;
startPt.y = 200;
这里要知道startPt是一个结构而不是一个对象,根据变量名前面是否有星号来判断。Apple也提供了简便的函数用于创建CGPoint,CGSize,CGRect结构。例如:
CGPoint startPt = CGPointMake (100.0,200.0);
定义一个矩形,设置为200*100
CGSize rectSize = CGSizeMake (200.0 , 100.0);
继续创建一个包含尺寸和原点的矩形:
CGRect theFrame;
theFrame.origin = startPt;
theFrame.size = rectSize;
如果希望改变矩形的宽度为175,则代码如下:
theFrame.size.width = 175;
3.关于结构的补充细节
在将变量定义为特定结构类型的同时,声明这个结构是合法的。例如:
struct date
{
int month;
int day;
int year;
}today,purchaseDate;
还可以按照常规变量进行初始化。
struct date
{
int month;
int day;
int year;
} today = {9.25.2011};
如果定义结构时,也定义了该结构类型的所有变量,那么可以省略结构名称。例如:
struct
{
int month;
int day;
int year;
} dates[100];
因为没有这个结构的名称,所以定义同类型变量的唯一方式就是再次显示定义这个结构。