结构体共用体枚举____笔记

Posted 我即狂澜,且力不可挽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构体共用体枚举____笔记相关的知识,希望对你有一定的参考价值。

-------------------讲在前面

    老规矩,本人小菜。

    互联网是发达的,神奇的。其中,有开源与不开源一说,我不知道我懂多少。

    我在网上取我所需,但是有时候会标注来源,有时候没标注。如果某大神觉得被冒犯了,请联系删除。

    我会有复制粘贴,但我并不认为拿过来就是我的东西,只是纯粹的欣赏,学习。

    开博客,主要是觉得对自己学习有益。我会记录自己觉得有意义的东东。

    如果有人见到本文章,是我的荣幸,希望对你有所帮助。

    当然,我不保证绝对正确,若你发现不对的地方,可以评论或者联系,指正批评,大家相互学习。

---------------------------------------------------------------------------Now Start

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\t%c\n",(*p).len,(*p).array[0]);
    printf("%d\t%c\n",p->len,p->array[0]);
    //printf("%d\n",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\t",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\n",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\n",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\n",Monday,Tuesday ,Friday,Sunday);
    
    return 0;
}

 


------------------------------------------------------------------------











以上是关于结构体共用体枚举____笔记的主要内容,如果未能解决你的问题,请参考以下文章

C语言结构体和共用体_07

实验6 结构体共用体与枚举

实验6 结构体共用体与枚举

20160402_[转]联合体(union)的使用方法及其本质

一篇文章带你由浅入深去感受四种自定义类型的魅力——结构体类型,位段,枚举类型,联合体(共用体)类型

C语言-枚举共用体