结构体

一、  结构体类型

    由于数组中只能存放同一类型的数据,所以c语言就规定把一些具有内在联系的不同数据类型的数据组合起来形成组合型的数据结构称为结构体。

     声明一个结构体类型的一般形式为

      struct   结构体名

             {成员表列}:

例如:  

      struct Student

               {

                    int num:                //学号为整型

                    char name[20];      //姓名为字符串

                    char sex;               //性别为字符型 

                   float age;              //成绩为实型

                       };

二、  结构体变量

    前面只是定义了一个结构体类型,它相当于一个模型,并没有定义变量,其中并无具体的数据,所以系统不给它分配内存,为了能在程序中使用结构体类型数据,应当定义结构体类型的变量,并在其中存放具体的数据。  

      可以使用以下三种方法定义结构体类型变量

    1、先声明结构体类型,再定义该类型的变量

      例如:在前面已定义好结构体类型struct Student,可以用它来定义变量

       

             struct Student

               {

                    int num:                //学号为整型

                    char name[20];      //姓名为字符串

                    char sex;               //性别为字符型 

                   float age;              //成绩为实型

                       };        

          struct Student student1,student2;   //结构体类型名 变量名1,变量名2;

         这种形式和定义其他类型的变量形式相似(如 int a,b:)

        在定义好结构体变量后,系统会为之分配内存单元,大小为结构体类型中包含的所有成员的内存大小之和。

   2、在声明类型的同时定义变量

     例如:

          struct Student

               {

                    int num:                //学号为整型

                    char name[20];      //姓名为字符串

                    char sex;               //性别为字符型 

                   float age;              //成绩为实型

                       }student1,student2;

            这种定义方法的一般形式为

                   struct 结构体名

                            {

                             成员列表

                               }变量名;

             声明类型和定义变量放在一起进行,能直接看到结构体的结构,比较直观,在写小程序时用此方式比较方便,但在写大程序时,往往要求对类型的声明的对变量的定义分别放在不同的地方,以使程序结构清晰,便于维护,所以一般不多用这种方式。

        3、不指定类型名而直接定义结构体类型变量

            其一般形式为

         struct

             {

           成员表列

             }变量名;

          指定一个无名的结构体类型,它没有名字,显然不能再以此结构体类型去定义其他变量,这种方式用的不多。

    说明:

          (1)结构体类型和结构体变量是不同的概念,不要混淆。只能对变量赋值、存取或运算,而不能对一个类型进行赋值、存取或运算 。在编译时,对类型是不分配空间的,只对变量分配空间。

           (2)结构体类型中的成员可以与程序中的变量名相同,但二者不代表同一对象。

三、结构体变量的初始化和引用

         在定义结构体变量时,可以对它初始化,即赋予初值,然后再引用这个变量。

         例如:

            struct Student

                   {

                      long int num;

                      char name[20];

                      char sex;

                      float score;

                      }a={10086,"卡布达",‘男’,100.0};

          (1)  在定义结构体变量时可以对它的成员进行初始化。初始化列表是用花括号括起来的一些常量,这些常量依次赋给结构体变量中的各成员。注意:是对结构体变量进行初始化,而不是对结构体类型初始化。

         (2)可以引用结构体变量中成员的值,引用方式为: 结构体变量名.成员名

        “.”是成员运算符,它是所有运算符中优先级最高的,因此可以把student1.num作为一个整体来看待,相当于一个变量。

注意:不能企图输出结构体变量名来达到输出结构体变量所有成员的值

下面用法不正确:

      printf("%s",stdent1);

          注意只能对结构体变量中的各个成员进行分别输入和输出。

          (3)  如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级成员,只能对最低级的成员进行赋值存取或运算应用方式为例如:  

               student1.birthday.month

          (4)对结构体变量的成员可以像普通变量一样进行各种运算

        (5)同类的结构体变量可以相互赋值

               student1=student2;              //假设student1和student2已定义为相同类型的结构体变量

        (6)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。

       例如:

               scanf("%d",&student1.name);          //输入student1.name的值

              printf("%o",&student1);                  //输出结构变量student1的首地址

        但不能用以下语句整体读入结构体变量,例如:

           scanf("%d,%s,%c,%f\n",&student1);          //错误

     

阅读更多
文章标签: 结构体
个人分类: c语言
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭