结构体,联合体,枚举体

结构体概述

可以将基本类型组合起来,形成一个新的自定义类型,这种类型称为结构体类型。

例如:

          struct Contact

          {

            int id;

            char name[16];

            char phone[16];

          };

这样,就定义了一个自定义类型Contact,它组合了一个int型数据,俩个char型数组。这种由关键字struct引导的语法称为“结构体”。

         struct语法的基本形式为:

          struct TypeName

          {

            Members

          };

其中,TypeName是新的类型的名字,Members是成员变量的列表。

(大括号末尾一定要加上分号)

结构体基本用法

   变量定义和初始化

可以使用结构体类型作为类型名,来定义一个变量。

1,定义一个变量

   Contact  a  //定义一个变量,不指定初始值

2,定义并指定初始值

和数组的初始值语法类似,可以用大括号将各个成员的初始值列出。如果有多个成员,则需要顺序一致。例如:


  Contact b =

{

      201501,            //id: 一个int值

      "Jennifer",        //name: 一个char型数组

      "13810022334"     //phone:一个char型数组

};

指定初始值时:

1,注意使用大括号,末尾要加分号结束。

2,各字段的初始值要与该字段的类型匹配。

3,各初始值的顺序要与成员变量的顺序一致。

4,各初始值以逗号分开,最后一个成员后面不需要加逗号。

和数组一样,可以只初始化部分成员变量,例如

Contact a = { 201501,"John" };

也可以直接清零,一次性将所有字段均置为。

Contact a = {0};

10.3.2 访问结构体的成员

可以使用点号访问结构体变量的成员,例如:

     Contact c;

     c.id = 201501;                                     //访问c.id

     strcpy(c.name, "John");                     //访问c.name

     strcpy(c.phone, "18601011223");   //访问c.phone

注意:大括号只能用于初始化时,不能再赋值的时候使用。一下的代码是错误的。

            Contact b;

             b = {201501,"Jennifer", "13810022334" };  //错!赋值时不能使用大括号!

10.3.3 定义结构体数组

可以和基本类型一样,定义数组,表示并排的多个对象。

Contact    cs[4];

也可以在定义的同时初始化,注意最后一个成员后面不需要加逗号。


Contact cs[4] =

{

   {201501, "John", "18601011223" },

   {201502, "Jennifer", "13810022334" },

   {201503, "AnXin", "18600100100" },

   {201504, "Unnamed", "18601011223" }

};

同样地,数组的元素类型是结构体,所以可以先用中括号[  ]取得元素,然后再用点号访问元素内的成员。例如:

for(int i = 0; i<4; i++)

{

      print("id:   %d,  Name:    %s,   Phone:    %s\n",

           cs[i].id,              //第i个元素的id的值

           cs[i].name,      //第i个元素的name的值

           cs[i].phone);   //第i个元素的phone的值

}


10.5  结构体的更多用法

结构体的赋值

和基本类型的用法类似,结构体类型的变量也是可以相互赋值的,;例如:

Contact a = {20141003, "AnXin", "18600100100"};

Contact b;

b  =  a;             //赋值

结构体指针

在结构体类之后加上* 号,就表示相应的指针类型。例如:

Contact * p = &a;   //定义结构体指针

对于指针指向的对象,可以用-〉操作符来访问对象的成员,例如:

p -> id = 20141011;                                       //使用->访问对象的成员

strcpy(p -> phone, "13800100100");         //使用-〉访问对象的成员

注意:也可以写成(*p).id  ,但不推荐这么写,通常应该使用->操作符。

10.5.3  作为函数的参数。

和基本类型一样,结构体也可以作为函数的参数。

传值方式

void test (Contact a)

{

     printf("id:  %d  ,   name:   %s   \n"  , a.id,  a.name);

}

传地址方式

void test (Contact *  p)

(

     printf("id:   %d  ,   name:    %s  \n",   p-> id,  p->name);

}

下面是函数调用的示例代码。

Contact a = {20141003, "AnXin", "18600100100");

test(a);

test(&a);

作为函数返回值类型。例如:

Contact create (int id)

{

   Contact  a;

    a.id  =  id;

    return a;                 //像基本类型一样,直接return

};

10.5.5  作为结构体的成员

成员的类型也可以是结构体类型。 例如:

struct  Color

{

            unsigned char r;

            unsigned char g;

            unsigned char b; 

};

struct  Object

{

      int x, y;

      Color  rgb;        //此成员是Color类型

};

也可以像下面这样定义Object对象并指定初始值。

Object obj =

{

   1

    2,

    { 0xff,0x00,0x00}

};

可以像下面这样访问对象obj的成员rgb下面的成员。

printf("obj:  (%d,  %d)color:  #  %02x % 02x % 02x  \n",

          obj.x,  obj.y,

          obj.rgb.r,

          obj.rgb.g,

          obj.rgb.b);

10.6.4   C语言中的struct定义

   C++对原来的C语言进行了扩展和优化,其中struct语法就做了一些优化。在原来的C语言中,struct的定义是这样子的:

struct Object

{

   int x;

   int y;

};

Object 类型的定义语法和C++中的一样,但在C语言中定义结构体变量的时候,struct关键字必须要加上。例如:

struct Object a;

struct Object * P;

struct Object objs[128];

这意味着,在C语言中struct  Object 必须连在一起写才是一个类型。这个语法是有点啰嗦的。于是在C++中对其进行简化,直接使用Object作为一个类型名。





           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值