ios开发|【IOS 开发学习总结-OC-7.5】objective-c 的c语言特性——结构体
有时候,程序需要多个基本类型的组成一个有机整体,比如说定义一个矩形,就需要 x,y,width,height 4个值。这就需要使用 语言提供的结构体。
定义结构体 语法格式:
struct结构体类型名
{
//成员列表;
}
其中,struct 是关键字。结构体类型名可以任意指定,成员列表可以是基本类型也可以是结构体类型。
定义一个 rect 结构体类型,示例:
structrect
{
int x;
int y;
int width;
int height;
}
定义结构体类型后,就可以利用该结构体定义变量了。利用结构体类型定义变量有2种形式:
1.先定义结构体类型,再定义结构体变量。 语法格式如下:
struct 结构体名 变量名;
注意不要忘了 struct 关键字。示例代码:#import int main(int argc , char * argv[])
{
@autoreleasepool{
// 定义point结构体类型
struct point
{
int x;
int y;
};
//使用结构体类型定义2个变量
struct point p1;
struct point p2;
// 定义rect结构体类型
struct rect
{
int x;
int y;
int width;
int height;
};
//使用结构体类型定义2个变量
struct rect rect1;
struct rect rect2;
}
}
这种每次定义变量时都需要使用 struct 关键字,比较繁琐。有2种简化方法:
一是:使用#define 预编译指令为 struct point,struct rect 定义成一个简短的字符串,比如:
//简化 struct 类型名为POINT,RECT
#define POINT struct point
#define RECT struct rect
二是:使用 typedef 为已有的结构体类型定义新名称。
typedef语句是给已有 的数据类型另起一个名称。语法格式为:
typedef 已有类型 新名称;
typedef 语句是为了给已有的数据类型一个可读性更强的名字,但不可滥用,否则会造成数据类型混乱。typedef 语句常用的地方:
1.当定义枚举类型后,通过typedef 为枚举类型起一个别名可能更简洁。
2.使用typedef为结构体类型起一个可读性强的别名。
示例代码:
#import
int main(int argc , char * argv[])
{
@autoreleasepool{
// 定义point结构体类型的同时,还定义结构体变量
struct point
{
int x;
int y;
};
// 为struct point类型起一个新名称:FKPoint
typedef struct point FKPoint;
// 定义一个season枚举类型
enum season {spring, summer, fall , winter};
// 为enum season类型起一个新名称:FKSeason
typedef enum season FKSeason;
// 使用FKPoint定义p1、p2两个结构体变量
FKPoint p1;
FKPoint p2;
// 使用FKSeason定义s1枚举变量
FKSeason s1;
}
}
2.同时定义结构类型和结构体变量 语法格式:
struct 结构体名
{
//成员列表
}结构体变量1,结构体变量2...;
示例代码如下:
#import
int main(int argc , char * argv[])
{
@autoreleasepool{
// 定义point结构体类型的同时,还定义结构体变量
struct point
{
int x;
int y;
} p1;
//使用结构体类型定义1个变量
struct point p2;
// 定义rect结构体类型的同时,还定义结构体变量
struct rect
{
int x;
int y;
int width;
int height;
} rect1;
//使用结构体类型定义1个变量
struct rect rect2;
}
}
特别说明:这种方式下,如果程序只需要定义结构体类型的同时定义变量,以后无需再次使用该结构体类型来定义变量,程序甚至可以在定义结构体类型时省略结构体类型名。如下示例代码:
struct
{
int x;
int y;
}p1;
初始化结构体变量 一般来说,结构体变量不允许直接赋值。只能分别对结构体的成员进行赋值或者访问结构体变量的某个成员。访问结构体成员变量的语法:
结构体变量.成员名
只有在定义结构体变量时才能执行初始化。在定义结构体类型的同时定义结构体变量,OC 允许在定义结构体变量时对结构体变量执行初始化;使用 typedef 定义的别名来定义结构体变量时,可以对结构体变量执行初始化。
对结构体变量执行初始化的语法格式:
{值1,值2,值3……};
,初始化的成员变量值的数量可以少于结构体变量所包含的成员数量。这种情况下,该初始化只对结构体变量的前面几个成员执行初始化。示例代码:#import int main(int argc , char * argv[])
{
@autoreleasepool{
// 定义point结构体类型的同时,还定义结构体变量
// 可以直接对结构体变量执行初始化
struct rect
{
int x;
int y;
int width;
int height;
} rect1 = {20 , 30 , 100 , 200};
// 下面代码是错误的
//rect1 = {1 , 2 , 3 , 4};
// 定义结构体类型
struct point
{
int x;
int y;
};
// 为struct point类型起一个新名称:FKPoint
typedef struct point FKPoint;
// 使用FKPoint定义结构体变量时,允许直接初始化
FKPoint p1 = {20 , 30};
FKPoint p2 = {10};
NSLog(@"p1的x为:%d, p1的y为:%d" , p1.x , p1.y);
NSLog(@"p2的x为:%d, p2的y为:%d" , p2.x , p2.y);
// 下面代码是错误的
//p1 = {2 , 3};
FKPoint p3;
// 依次对结构体变量的每个成员赋值,这总是正确的
p3.x = 10;
p3.y = 100;
NSLog(@"p3的x为:%d, p3的y为:%d" , p3.x , p3.y);
}
}
结构体数组 【ios开发|【IOS 开发学习总结-OC-7.5】objective-c 的c语言特性——结构体】结构体数组与普通类型数组没有大区别,同样可以爱定义数组的时候对所有的数组元素执行初始化。但在此之后不能在程序运行中对结构体数组元素整体赋值。示例代码:
#import int main(int argc , char * argv[])
{
@autoreleasepool{
// 定义结构体类型
struct point
{
int x;
int y;
};
// 为struct point类型起一个新名称:FKPoint
typedef struct point FKPoint;
// 定义结构体数组,并初始化数组元素
FKPoint points[] = {
{20 , 30},
{12 , 20},
{4 , 8}
};
// 下面代码是错误的
//points[1] = {20 , 8};
// ①
// 单独对结构体变量的每个成员赋值是允许的
points[1].x = 20;
points[1].y = 8;
// 遍历每个结构体数组元素
for (int i = 0 ;
i < 3 ;
i++)
{
NSLog(@"points[%d]的x是:%d, points[%d]的y是:%d"
, i , points[i].x, i , points[i].y);
}
}
}
推荐阅读
- 宽容谁
- 我要做大厨
- 增长黑客的海盗法则
- 画画吗()
- 2019-02-13——今天谈梦想()
- 远去的风筝
- 三十年后的广场舞大爷
- 叙述作文
- 深入理解Go之generate
- 20190302|20190302 复盘翻盘