12 结构体、共用体和枚举类型-c语言初学系列

知识要点

结构体类型的定义

结构体类型变量

结构体数组

共用体

枚举类型

数据类型

结构体类型的定义

结构体类型定义的一般形式为:

        struct   结构体名
        { 
类型名1   成员名1;
             ……
           类型名n   成员名n;
          } ;

struct是结构体类型的标志。结构体名是由用户定义的标识符,它规定了所定义的结构体类型的名称。结构体类型的组成成分称为成员,成员名的命名规则与变量名相同。

结构体类型定义形式

例如:     struct  person
                      { char name[20];
                         char sex;
                         int age;
                         float height;
                         } ;

表示定义了一个结构体类型——struct person,它由name、sex、age和height四个成员组成。

练习:定义一个结构体类型struct student,要求包含学生姓名、学号、数学成绩、英语成绩、计算机成绩、总分、邮政编码、通讯地址。

在结构体类型定义中要注意以下几点:

结构体类型定义中不允许对结构体本身递归定义。例如下列定义是不合法的。

      struct  person
         { char name[20];
            char sex;
            int age;
         float height;
            struct person  per;
   };

在结构体类型定义中要注意以下几点:

结构体类型定义中可以包含另外的结构体,即结构体是可以嵌套的。例如:

struct date
   { int year;
     int month;
     int day;   };
struct person
   { char name[20];
     char sex;
     struct date  birthday;
     float height;   };

结构体类型变量

一、结构体变量的定义

定义结构体类型,只是说明了该类型的组成情况,编译系统并没有给它分配内存空间,就象系统不为int等类型本身分配空间一样。只有当定义属于结构体类型的变量时,系统才会分配存储空间给该变量。

一、结构体变量的定义

先定义结构体类型,再定义变量。例如:

struct  person
   { char name[20];
      char sex;
     int age;
     float height;
   };
         struct  person  per;


表示先定义了结构体类型struct person,然后定义了一个struct person类型的结构体变量per。
结构体变量占用的内存空间是其成员所占内存之和,因此per 占用的内存空间为20+1+2+4=27个字节。结构体变量中的各成员在内存中按定义的顺序依次排列。
注意:定义变量时,struct person必须在一起使用,它的用法与int、char等类型名的用法相同。

定义类型的同时定义变量。例如:

struct  person
{ char name[20];
   char sex;
   int age;
   float height;
   }per;


这种方法定义的效果与前一种相同,也是定义了结构体类型struct person和一个属于struct person类型的结构体变量per。

直接定义结构体类型变量,省略类型名。

struct  
{ char name[20];
    char sex;
    int age;
         float height;
        } per;

这种定义形式与前两种方法不同,没有说明这种结构体类型的名称。所以这种方式通常用在不需要再次定义此类型结构体变量的情况下。

二、结构体变量的初始化

与普通变量一样,结构体类型的变量也可以在定义时进行初始化。将结构体变量各成员的初值顺序地放在一对大括号中,并用逗号分隔。:

struct  person
   { char name[20];
     char sex;
     int age;
     float height;
   }per={"Li Ping",’M’,20,175.5};

对结构体类型变量赋初值时,按每个成员在结构体中的顺序一一对应赋值。

三、结构体变量的引用

结构体变量的引用必须在定义结构体变量后进行。

对结构体变量的引用可以分为对结构体变量中成员的引用和对整个结构体变量的引用。

一般对结构体变量的操作是以成员为单位进行的。

(1)对结构体变量中成员的引用

引用的一般形式为:

结构体变量名.成员名

“.” 是成员运算符.它在所有运算符中优先级最高。

如果某个成员本身又是结构体变量,则必须连续使用成员运算符,直到最低一级成员才能进行运算。

结构体变量的每个成员都属于某种数据类型,因此都可以像普通变量一样进行其类型允许的各种操作。

#include <stdio.h>
void main()
{struct  person
  { char name[20];
    char sex;
    struct  date
       { int year;
         int month;
         int day;
       }birthday;
    float height;
  }per;
printf("Enter the name: ");
gets(per.name); per.sex=’M’;
per.birthday.year=1982;
per.birthday.year++;
per.birthday.month=12;
per.birthday.day=15;
per.height=(175+176)/2;
printf("%s%3c%4d/%2d/%d%7.1f\n",per.name,per.sex, per.birthday.month, per.birthday.day, per.birthday.year, per.height);}

(2)对整个结构体变量的引用

相同类型的结构体变量之间可以进行整体赋值。

结构体变量只允许整体赋值,其它操作如输入、输出等必须引用结构体变量的成员。

程序L12_2.C功能:对整个结构体变量进行操作
void main()
{struct  person
  { char name[20];
    char sex;
    struct  date
       { int year;
         int month;
         int day;
       }birthday;
    float height;
  }per1,per2={"Li Ping",’M’,1982,12,15,175.5};
per1=per2;
printf("%s%3c%4d/%2d/%d%7.1f\n", per1.name , per1.sex, per1.birthday.month, per1.birthday.day,  per1.birthday.year, per1.height);
}

结构体数组

一、结构体数组的定义

定义结构体数组的方法和定义结构体变量的方法一样,只是必须说明其为数组。例如:

struct  person
 { char name[20];
      char sex;
       int age;
       float height;
      };
    struct  person  per[3];

定义结构体变量的三种方法都可以用来定义结构体数组。例如:

struct  person
   { char name[20];
     char sex;
     int age;
     float height;
   }per[3];
struct  
   { char name[20];
     char sex;
     int age;
     float height;
   }per[3];

二、结构体数组的初始化

和一般数组一样,结构体数组也可以进行初始化。

struct  person
{ char name[20];
  char sex;
   int age;
   float height;
 }per[3]={{ "LiPing",’M’,20,175},{"WangLing",’F’,19,162.5},  
             {"Zhao Hui",’M’,20,178}};

数组每个元素的初值都放在一对大括号中,括号中依次排列元素各成员的初始值。

与一般数组的初始化一样,如果给出了全部元素的初值,则数组的长度可以不指定,由系统根据初值的数目来确定数组长度。

三、结构体数组的引用

对结构体数组的引用一般是对数组元素的成员进行引用。引用只要遵循对数组元素的引用规则和对结构体变量成员的引用规则即可。

程序L12_3.C功能:输出结构体数组各元素的成员值
void main()
{struct  person
         { char name[20];
 char sex;
        int age;
  float height;
           }per[3]={{ "Li Ping",’M’,20,175},
   {"Wang Ling",’F’,19,162.5},{"Zhao Hui",’M’,20,178}};
int i;
for(i=0;i<3;i++)
printf("%–18s%3c%4d%7.1f\n”,
    per[i].name, per[i].sex, 
    per[i].age, per[i].height);  }

问题

定义一种类型stu可以放学生的姓名、学号、英语成绩,其中英语成绩有的老师按照“A”、“B”、“C”、“D”、“F”五个等级给的,有的老师按照百分制给的成绩,要求该类型可以如实反映学生的情况。

共用体

一、共用体类型及其变量的定义

共用体类型定义的一般形式为:

        union  共用体名
            { 类型名1   成员名1;
              ……
              类型名n   成员名n;
             } ;

union是共用体类型的标志。共用体名是由用户定义的标识符,它规定了所定义的共用体类型的名称。共用体类型也由若干成员组成。

一、共用体类型及其变量的定义

union  score
  { char grade;
     float point;
   };

表示定义了一个共用体类型union score,它由grade和point两个成员组成

  1. 先定义共用体类型,再定义变量。例如:
union  score
   { char grade;
     float point;
   };
union score s;

2. 定义类型的同时定义变量。:

union  score
   { char grade;
     float point;
   }s;

3.直接定义共用体类型变量。

union  
   { char grade;
     float point;
   }s;

共用体类型及其变量的定义在形式上与结构体很类似。但它们的含义是不同的。结构体变量的每个成员分别占有独立的内存区域,因此结构体变量所占的内存字节数是其成员所占内存字节数之和。而共用体变量的所有成员共同占用一段内存区域,所以共用体变量所占字节数是其成员中占内存空间最大的成员的字节数。

二、共用体变量的引用

共用体变量也必须先定义,后使用。不能直接引用共用体变量,只能引用共用体变量的成员。引用的一般形式为:

共用体变量名.成员名

共用体变量的每个成员也可以像普通变量一样进行其类型允许的各种操作。

注意:由于共用体类型采用的是覆盖技术,因此共用体变量中起作用的总是最后一次存放的成员变量的值。

程序L12_4.C功能:引用共用体变量的成员
#include <stdio.h>
void main()
{   union  temp
       { char a;
          int b;
        } t;
  t.a=66;  t.b=266;  
/*266=256+10即266的二进制为1 00001010,所以高字节放1、低字节放10*/
  printf("%x:%d , %x:%d\n",&t.a , t.a ,&t.b , t.b);}

共用体

共用体变量可以作为结构体变量的成员,结构体变量也可以作为共用体变量的成员,并且共用体类型也可以定义数组。

程序L12_5.C功能:共用体变量作为结构体变量的成员

注意:不能对共用体变量进行初始化。不能将共用体变量作为函数参数和返回值。

 struct  student
     { char *name;
       int dept;
       union  score
         { char grade;
           float point;
          } s;
       }stu[2];

枚举类型

一、枚举类型及其变量的定义

枚举类型定义的一般形式为:

    enum   枚举名  {枚举元素1,枚举元素2,……};

enum是枚举类型的标志。枚举名是由用户定义的标识符,它规定了所定义的枚举类型的名称,例如:

     enum  season  {spring, summer, autumn, winter};

表示定义了一个枚举类型——enum season,它包含四个枚举元素。

定义了枚举类型后,就可以用它定义枚举类型变量。枚举类型变量的定义有两种方法。

先定义枚举类型,再定义变量。例如:
    enum  season  {spring, summer, autumn, winter} ;
    enum  season  s;
表示定义了一个enum  season枚举类型和属于该类型的变量s。
  1. 直接定义枚举变量。例如:
enum  {spring, summer, autumn, winter } s;

(1)枚举类型中的枚举元素是用户定义的标识符,对程序来说,这些标识符并不自动代表什么含义。例如,写成spring并不自动表示为“春季”,写成spr也可以。

(2)在C 编译中,将枚举元素作为常量处理,称为枚举常量。因此不能对它们进行赋值。例如:

         spring=0; winter=1;是不合法的。      

(3)枚举元素是被处理成一个整型常量的,它的值取决于定义时各枚举元素排列的先后顺序。第一个枚举元素的值为0,第二个为1,依次顺序加1。

例如,在以上的定义中,spring的值为0,summer的值为1,autumn的值为2,winter的值则为3。

也可以在定义时改变枚举元素的值。例如:

          enum  {spring=1, summer, autumn, winter=0} s;

没有指定值的枚举元素,其值为前一元素值加1。因此,spring的值为1,summer的值为2,autumn的值为3,而winter的值为0。

二、枚举类型变量的基本操作

枚举变量的赋值
只能给枚举变量赋枚举常量。不能直接给枚举变量赋整型值,但是可以通过将整型值强制类型转换成枚举类型赋值。

程序L12_6.C功能:为枚举类型变量赋值
void main()
{ enum  season {spring, summer, autumn, winter} s1,s2 ;
   s1=summer;
   s2=(enum  season)2;
   printf("s1=%d,s2=%d\n",s1,s2); }

枚举元素的判断比较

程序L12_7.C功能:枚举变量作为循环控制变量
void main()
{ enum  season {spring=1, summer, autumn, winter} s ;
   for (s=spring;s<=winter;s++) 
       printf("%d  ",s);
   }

枚举变量只能通过赋值语句得到值,不能通过输入语句直接输入数据。也不能使用输出语句直接输出枚举元素,可以通过switch语句将枚举元素以字符串形式输出。

 switch(s)
 { case spring:     printf("spring\n");    break;
    case summer:  printf("summer\n");  break;
    case autumn:   printf("autumn\n");   break;
    case winter:     printf("winter\n");    break;
  }

类型定义-typedef

定义新类型名的一般形式是:

    typedef 类型名 标识符

使用typedef语句不是创造新类型,而是为已经存在的类型增加了一个名字。例如:

   struct person
     { char name[20];
        char sex;
        int age;
      };
   typedef struct person PERSON;
   PERSON per[3];

位运算

& 按位与

| 按位或

^ 按位异或

~ 取反

<< 左移

>> 右移

/*-----------------------------
  程序L12_8.C功能:统计学生人数
    计算平均成绩
 ----------------------------*/
 #include <stdio.h>
 void main()
 {
   struct  student
     { char name[20];
       char sex;
       int score;
       };
   struct  student  stu[5];
   int i,m_num=0,f_num=0;
   float average,sum=0;
   for(i=0;i<5;i++)
     { printf("Please input name :"); 
       gets(stu[i].name);
       printf("              sex :");
       scanf("%c",&stu[i].sex);
       printf("             score:"); 
       scanf("%d",&stu[i].score);
       getchar();
      }
   for(i=0;i<5;i++)
     { if (stu[i].sex=='M'||stu[i].sex=='m')
     m_num=m_num+1;
       else  f_num=f_num+1;
       sum=sum+stu[i].score;
      }
   average=sum/5;
   printf("m_num=%d, f_num=%d, average=%7.2f\n",
    m_num,f_num,average);
 }

练习:

1. 定义一个包括年、月、日的结构体变量,当输入年、

月、日数据后,计算该日是这一年中的第几天。

2.从键盘输入10个学生的数据,包括:学号、姓名、三门

课的成绩。要求输出三门课总平均 成绩,及最高分学

生的数据(学号、姓名、三门课成绩、平均分数)。

3.从键盘输入5个用户的数据,包括:姓名和电话号码

要求按姓名排序后,输出用户的全部数据。

4.定义一种类型stu可以放学生的姓名、学号、英语成绩

其中英语成绩有的老师按照“优”、“良”、“中”、“及格”

“不及格”五个等级给的,有的老师按照百分制给的成

绩,要求该类型可以如实反映学生的情况。

5.定义一个枚举变量,其枚举元素为人民币的面值。要

求输出枚举元素字符串。

6.使用结构体类型,修改“学生成绩管理系统”。

ps: 对应ppt模板下载地址如下:

12-结构体、共用体和枚举类型-自己使用的C语言教程PPT-适合老师备课或者自学.pptx-C文档类资源-CSDN下载


 

 全部课程的PPT已经整理好了,需要的童鞋可以点击下载
总-自己使用的C语言教程PPT-适合老师备课或者自学-15篇PPT合集.zip-C文档类资源-CSDN下载

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锁住子锁不住

老少爷们向前冲!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值