您的位置:首页 > 教程资讯 > 网络编程 > C语言 > 结构体类型

结构体类型

发布于:2016-05-07 13:29:13   分享到:

1.1结构体类型的说明

  结构体类型说明的一般形式为:

    struct 结构体标识名

    {

      类型名1  结构成员名表1

      类型名2  结构成员名表2

      ...

      类型名n  结构成员名表n

    };

  其中 struct 是关键字。“结构体标识名”和“结构成员名”是用户定义的标识符,其中“结构体标识名”是可选项,在说明中可以不出现。每个“结构成员名表”中都可以含有多个同类型的成员名,它们之间用逗号隔开。结构体中的成员名可以和程序中的其他变量同名;不同结构体中的成员也可以同名。注意:结构体说明同样要以分号(;)结尾。

    struct date

    {int year, month, day;};

  结构体类型说明中的“类型名”,不仅可以是简单数据类型,也可以是结构体类型。当结构体说明中又包含结构体时,成为结构体的嵌套。如下:

    struct student

    {

      char name[12];

      char sex;

      struct date birthday;

      float sc[4];

    };

  ANSI C 标准规定结构体至少允许嵌套15层,允许内嵌结构体成员的名字与外层成员的名字相同。

  结构体类型的说明只是列出了该结构的组成情况,标志着这种类型的结构“模式”已经存在,编译程序并没有因此而分配任何存储空间。真正占有存储空间的仍是具有相应结构体类型的变量、数组以及动态开辟的存储单元。因此,在使用结构体变量、数组或指针变量前,必须先对这些变量、数组或指针变量进行定义。

1.2结构体类型的变量、数组和指针变量的定义

  可以用以下四种方式定义结构体类型的变量、数组和指针变量:

  (1)紧跟在结构体类型说明之后进行定义。例如:

    struct student

    {

      char name[12];

      char sex;

      struct date birthday;

      float sc[4];

    } std, pers[3], *pstd;

  此处,在说明结构体类型 struct student 的同时,定义了一个结构体变量 std、有3个变量的结构体数组 pers 和基类型为结构体类型的指针变量 pstd。

  (2)在说明一个无名结构体类型的同时,直接进行定义。如:上述定义的结构体中可以把 student 省略,写成:

    struct

    {...

    } std, pers[3], *pstd;

  这种方式与前一种的区别仅仅是省略了结构体标识名,通常用在不需要再次定义此类型结构体变量的情况。

  (3)先说明结构体类型,再单独进行变量定义。如:

    struct student

    {...

    };

    struct student std, pers[3], pstd;

  此处,先说明了结构体类型 struct student,再由一条单独的语句定义变量 std、数组 pers 和指针变量 pstd。使用这种定义方式应注意:关键字 struct 必须和结构体标识名 student 共同说明结构体类型。

  (4)使用 typedef 说明一个结构体类型名,再用新类型名来定义变量。如:

    typedef struct

    {

      char name[12];

      char sex;

      struct date birthday;

      float sc[4];

    } STREC;

    STREC std, pers[3], *pstd;

  STREC 是一个具体的结构体类型名,它能够唯一地标识这种结构体类型。因此,它可以用来定义变量,如同使用 int 、char  一样,不可再写关键字 struct。

1.3 给结构体变量、数组赋初值

  和一般变量、数组一样,结构体变量和数组也可以在定义的同时赋初值。

  1.3.1 给结构体变量赋初值

  所赋初值放在一对花括号中,如:

    struct student

    {

      char name[12];

      char sex;

      struct date birthday;

      float sc[4];

    } std = {"Li Ming", ‘M’, 1997, 5, 10, 88.0, 76.0, 85.5, 90.0};

  赋初值后,变量 std 内容如图所示:

  name  sex    birthday  sc[0]  sc[1]  sc[2]  sc[3]

         year   month  day

  对结构体变量赋值时,C 编译程序按每个成员在结构中的顺序一一对应赋初值,不允许跳过前面的成员给后面的成员赋初值。但可以只给前面的若干成员赋初值,对后面未赋初值的成员,系统将自动为数值型和字符型数据赋初值0。

  1.3.2 给结构体数组赋初值

  由于数组中每个元素都是一个结构体,因此通常将其成员的值依次放在一对花括号中,以便区分各个元素。

    struct bookcard

    {

      char num[5];

      float money;

    } bk[3] = { {"NO.1", 35.5}, {"NO.2", 25.0}, {"NO.3", 66.7} };

         /* bk[0]      bk[1]      bk[2]  */

  也可以通过这种赋初值的方式,隐含确定结构体数组的大小。即:由编译程序根据所赋初值的成员个数决定数组元素的个数。以下是一个给二维数组赋初值的例子:

    struct

    {

      char ch;

      int i;

      float x;

    } arr[2][3] = {

             { {"a", 1, 3.0e10}, {"a", 2, 4.0e10}, {"a", 3, 5.0e10} },  /*第一行*/

             { {"b", 1, 6.0e10}, {"b", 2, 7.0e10}, {"b", 3, 8.0e10} }  /*第二行*/

           };

  根据花括号的嵌套关系,可以清楚的分辨出所赋初值与数组元素一一对应的关系。

  1.3.3 相同类型结构体变量之间的整体赋值

  ANSI C 标准允许相同类型的结构体变量之间进行整体赋值。如:

    struct

    {

      char name[10];

      int num;

    } per1, per2 = {"Jhon", 46};

  执行赋值语句:per1 = per2; 则 per2 中每个成员的值都赋给了 per1 中对应的同名成员。这种赋值方法必须要保证赋值号两边结构体变量的类型相同。

标签:

C语言 结构体

关于我们  加入我们  版权声明  商务合作  友情链接  网站地图  站长统计

脚本大全-脚本语言之家-版权所有 

Copyright (C) 2016 jiaoben.net, All Rights Reserved