C语言之结构体

 一、什么是结构体
           结构体是不同类型的数据组合成一个有机整体。例如:学生的学号
、姓名、性别、成绩、地址 这些都是一个学生的属性,把这些属性组织成一个组合,组合中包含不同的数据类型,C和C++允许指定这样的数据类型,称为结构体。
        struct Student  //申明一个结构体类型(struct是结构体申明的关键字)
          {
              int num;
              char name[20];
              char sex;
              int age;
              float score;
              char addr[30];          
           };               //最后要有分号

            申明结构体类型的形式:

          struct 结构体类型名

          {成员列表};
         注:C语言中的结构体包括数据,但在C++中可以包含函数
    二、结构体变量的定义方法及其初始化
          1.定义结构体变量的方法
        (1)先声明结构体类型在定义变量
                  struct Student student1,student2;//C++中可以不加关键字struct
        (2)在申明类型的同时定义变量
          struct Student
                  {
              int num;
              char name[20];
              char sex;
              int age;
              float score;
              char addr[30];          
           }student1,student2;
            一般形式为:
           struct 结构体名
              {
             成员列表
             }变量名列表;
          (3).直接定义结构体类型变量
     三、结构体变量的初始化
        struct Student
                  {
              int num;
              char name[20];
              char sex;
              int age;
              float score;
              char addr[30];          
           }student1 = {10001,"Zhang Xin",'M',19,90,5,"Shanghai"};yinyong 
        如果Student类已经声明也可以采用
        Student student = {10002,"Wang Li",'F',20,98,"Bingjing"};


     四、结构体变量的引用
         (1).可以将一个结构体变量赋值给另一个具有相同结构的结构体变量
         (2).引用结构体变量中的一个成员值:
             结构体变量名.成员名;
             例如:student.num = 100010;
         (3).不能将一个结构体变量作为一个整体进行输入和输出,只能对各个成员进行分别输入输出
         (4).结构体变量可以像普通变量一样进行运算
         (5).可以引用结构体成员变量的地址,也可以引用结构体变量的地址
     五、结构体数组
         结构体数组的每个数组元素都是结构体类型的数据,包括各个成员项
        struct Student
                  {
              int num;
              char name[20];
              char sex;
              int age;
              float score;
              char addr[30];          
           };
           Student stu[3];   //三个结构体类型相同的同学




        也可以这样定义
           struct Student
                  {
              int num;
              char name[20];
              char sex;
              int age;
              float score;
              char addr[30];          
           }stu[3];
        1、结构体类型初始化
          struct Student
                  {
              int num;
              char name[20];
              char sex;
              int age;
              float score;
              char addr[30];          
           }stu[3] = {{ },{ },{ }};
           也可以不指定元素个数:
           stu[] = {{},{},{}};
           也可以:Student stu[] = { {},{},{}};
     六、指向结构体变量的指针
           结构体变量的指针指向结构体变量的起始位置,也可以指向结构体数组中的元素
          1. struct Student
                  {
              int num;
              char name[20];
              char sex;
              int age;
              float score;
              char addr[30];          
           }student1;
           Student stu;
           Student *p = &stu;
           cout<<(*p)>num<<" "<<(*p).num<<endl;
           *p是指向结构体Student的指针,(*p)表示指向结构体变量且由于运算符优先级不同,括号不可省略。在C++中等价于p->num;
          三种表示方法等价:stu.num\(*p).num\p->num
          2.用指向结构体变量的指针构成链表
          struct Student
                  {
              int num;
              char name[20];
              char sex;
              Student * next;  //next指向Student结构体变量用这个方法可以建立链表
                     };
         例:#define NULL 0
             #include <iostream>
              struct Student
                    {
                      long num;
                      float score;
                      struct Student *next;
                     };
              int main()
                {
                    Student a,b,c,*head,*p;
                    a.num = 31001;a.score = 89.5;               //对结构体成员赋值
                    b.num = 31003;b.score = 90;                 
                    c.num = 31007;c.score = 85;
                    head = &a;                                  //a的起始地址赋值给head
                    a.next = &b;                                //b的起始地址赋值给a的next结点
                    b.next = &c;
                    c.next = NULL;
                    p = head;                                  //p指针指向a结点
                   do
                     {
                          cout<<p->num<<" "<<p ->score<<endl;   //输出P结点的数据成员
                          p = p ->next;                         //p指向下一结点
                      }while(p!= NULL);
                  return 0;


                       }
      七、结构体类型作为函数参数
                 (1).结构体名作为参数:
                       struct Student
                    {
                      long num;
                      float score;
                      struct Student *next;
                     };
                    void print(Student);
                  (2).指向结构体变量的指针做实参
                     struct Student
                    {
                      long num;
                      float score;
                      struct Student *next;
                     }stu{123456,"Li",65.5,89,78.5};
                     void print(Student *);                 //形参为指向Student的指针变量
                     Student *pt = &stu;
                     print(pt);
                 (3).结构体变量引用做函数参数
                          struct Student
                    {
                      long num;
                      float score;
                      struct Student *next;
                     }stu{123456,"Li",65.5,89,78.5};
                    void print(Student &);
       八、共用体
               几个不同变量共占用同一段内存结构为共用体,共用体内存长度等于最长成员长度
                union data
                  {
                    int i;
                    char ch;
                    double d;
 
                   }a,b,c;
                注意:不能引用共用体变量,而只能引用共用体变量的成员:a.i   输出时:cout<<a.i;
       九、枚举
             一个变量只有几种可能的值,可以使用枚举:enum weekday{sun,mon,tue,wed,thu,fri,sat};  枚举类型weekday的枚举常量
             一般类型为:enum 枚举类型名{枚举常量表列};weekday workday,week_end;这样workday,week_end被定义为weekday的变量
                         也可以写成:enum weekday workday,week_end;
               C++中也可以写成:enum{sun,mom,tue,wed,thu,fri,sat}workday,week_end;
       十、用typedef声明类型
           如:typedef int INTEGER;int i,j;INTEGER i,j;
               typedef也可以声明结构体类型


























      
    
    
                        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值