zoukankan      html  css  js  c++  java
  • __c语言__结构体、共用体、枚举__笔记

    2017-09-16 21:14:09

    结构体,共用体,枚举

    1.结构体
      把不同的类型整合成一个有机的整体,以便于引用,这个类型就叫做结构体
      1)结构体变量的定义方式(3种)和引用成员变量;
        定义一个结构体的一般形式为
          struct 结构体名
          {
            成员表列(成员类型 成员名);
          };

        !!!成员名可以和变量名重名!!!
        可以采取三种方式定义结构体类型变量

          a.先声明结构体类型再定义变量名
            struct student
            {
            int num;
            char name[20];
            float score;
            char address[30];
            };
            struct student stu1,stu2;


          ***************************************************
          b.在声明类型的同时定义变量
            一般形式为:

              struct 结构体名
              {
              成员表列;
              }变量名;

            struct student
            {
              int num;
              char name[20];
              float score;
              char address[30];
            }stu1,stu2;
      
            struct student stu3;

          ***************************************************
          c.直接定义结构体类型变量
            一般形式为:

              struct
              {
                成员表列;
              }变量名表列;

            struct
            {
              int num;
              char name[20];
              float score;
              char address[30];
            }stu1,stu2;

            struct stu3; 错误
            "." 引用成员变量
    ***************************************************
      2)结构体成员的内存布局问题及字节对其问题;
        a.结构体的数据成员,第一个数据保存在offset为0的地方,以后每个数据成员存储的起始地址要从
           该成员大小的整数倍或者是4的整数倍开始(取两者中的最小值);


        b.如果一个结构体里面有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍开始
           或者是4的整数倍开始(取两者中的最小值);


        c.结构体总大小,必须是内部最大成员的整数倍或者是4的整数倍(取两者中的最小值);


      3)柔性数组与指向结构体类型的指针
        

    #include<stdio.h>
    #include<stdlib.h>
    int main(int argc,char *argv[])
    {
        struct soft_array
        {
            int len;
            int array[];//占座位
        };
    
        /*
        struct student  stu1;
        stu1.len = 10;
        stu1.array[0] = 'a';
    
        struct student *p = &stu1;
    
        printf("%d	%c
    ",(*p).len,(*p).array[0]);
        printf("%d	%c
    ",p->len,p->array[0]);
        //printf("%d
    ",stu1->len);   错误
        //
        */
        int n;
        scanf("%d",&n);//单元个数
        struct soft_array *p = (struct soft_array *)malloc(sizeof(int)*n);
        if(p == NULL)
        {
            perror("malloc error");
            return -1;
        }
        p->len = n;
    
        int i;
        for(i = 0;i < n -1;i++)//len 已经占用了一个int,所以array占用的int个数为n-1
        {
            p->array[i] = 100+i;
            printf("%d	",p->array[i]);
        }
        return 0;
    }

        ->(指向运算符) 只能是指针使用

      4)结构体数组
        struct student
        {
          int num;
          char name[20];
          float score;
          char address[30];
        }struct student stu[10];


      5)结构体做函数参数
        

    #include<stdio.h>
    
    struct student
    {
        int num;
        char name[20];
        float score;
        char address[30];
    };
    
    void func(struct student *a)
    {
        printf("%d %s
    ",a[0].num,a[0].name);
    }
    
    int main(int argc,char *argv[])
    {
        struct student stu1[2] = {1,"xiaoming",100,"BeiJing"};
        func(stu1);
        return 0;
    }


    ------------------------------------------------------------------------
    2.共用体
      所有成员共用同一段内存空间,空间有多大,视其中最大成员而定,
      他们的首地址都相同!!!
      定义共用体的方式和结构体前两种方式一样!!!
        union 共用体名
        {
          成员表列;
        };


    大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,
      而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:
      地址由小向大增加,而数据从高位往低位放;


    小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,
      而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,
      高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。

    判断是小端模式还是大端模式:  

    #include<stdio.h>
    int main(int argc,char *argv[])
    {
        union test
        {
            int a;
            char b;
        };
    
        union test t;
        t.a = 0x12345678;
        //printf("%p  %p",&t.a,&t.b);
        printf("%x
    ",t.b);
        return 0;
    }

    ------------------------------------------------------------------------
    3.枚举
    enum 枚举名 {成员}
    枚举类型在内存中间占据4字节的unsigned int !!!

    #include<stdio.h>
    int main(int argc,char *argv[])
    {
        enum day {Monday=1,Friday=5, Sunday};
        enum day Tuesday = 2;        //要求赋值是给到的枚举出来的类型
        printf("%d  %d  %d  %d
    ",Monday,Tuesday ,Friday,Sunday);
        
        return 0;
    }













    --------小尾巴 ________一个人欣赏-最后一朵颜色的消逝-忠诚于我的是·一颗叫做野的心.决不受人奴役.怒火中生的那一刻·终将结束...
  • 相关阅读:
    List remove注意点
    枚举类比较的陷阱
    【好书推荐】《剑指Offer》之硬技能(编程题7~11)
    【好书推荐】《剑指Offer》之硬技能(编程题1~6)
    【好书推荐】《剑指Offer》之软技能
    在互联网中关系型数据库是否不再那么重要
    常用开发环境搭建配置教程(OneStall)
    让Mongo在Spring中跑起来
    MongoDB初了解——用户权限
    毕业这两年
  • 原文地址:https://www.cnblogs.com/tianxiaxuange/p/7532588.html
Copyright © 2011-2022 走看看