【IOS 开发学习总结-OC-7.5】objective-c 的c语言特性——结构体

有时候,程序需要多个基本类型的组成一个有机整体,比如说定义一个矩形,就需要 x,y,width,height 4个值。这就需要使用 语言提供的结构体。

定义结构体

语法格式:

struct  结构体类型名
{
    //成员列表;
}

其中,struct 是关键字。结构体类型名可以任意指定,成员列表可以是基本类型也可以是结构体类型。
定义一个 rect 结构体类型,示例:

struct  rect
{
    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);         
    }
}

结构体数组

结构体数组与普通类型数组没有大区别,同样可以爱定义数组的时候对所有的数组元素执行初始化。但在此之后不能在程序运行中对结构体数组元素整体赋值。示例代码:

#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); 
        }
    }
}

你可能感兴趣的:(ios开发,objective-c,语言学习总结)