C语言结构体

结构体

  1、结构体的概念:由多个相同或不同的数据类型组成的集合,集合内有多个用来描述的属性。

  2、结构体的声名:
    typedef struct student{
       成员属性列表;
    }student_t;

    声明的结构体类型是一个新的数据类型。

  3、定义结构体类型的变量:
    student_t stu; --------》 定义一个结构体类型的变量
    student_t stu1; --------》 定义一个结构体类型的指针
    student_t stu2[2]; --------》定义一个结构体类型的数组
    student_t 
stu3[2]; --------》定义一个结构体类型的指针数组
    student_t (*stu4)[2]; --------》定义一个结构体类型的数组指针

  4、对结构体变量的初始化:
    (1)、定义的同时进行初始化
        student_t stu = {value1,value2,......................};

    (2)、先定义,后初始化
        student_t stu;
        student_t  *stu1 = &stu;

    (3)、已经初始化的结构体,对另一个相同类型的结构体进行初始化(要求两个结构体类型一致)
        student_t stu;
        student_t  *stu1 = &stu;
        student_t stu5 = stu;
  5、结构体中成员的访问:
    普通的结构体类型变量使用 "."
      格式:
        结构体变量名 . 成员名;

      结构体指针类型变量使用 "->"
      格式:
        结构体变量指针 -> 成员名;
  6、在一个结构体之中是不能在定义一个与自身结构体类型相同的变量,但是可以定义一个与自身结构体类型相同的结构体类型指针。
    例如:
      typedef struct A1{
        int i;
        int  *j;
        struct A1  *L;
        //struct A1 H; //结构体里是无法定义一个与它自身结构体同类型的变量的。
      }A1_t;

       为什么?
         因为我们在定义好结构体的成员变量之后,系统会计算这个结构体占用的内存的大小。
         但是 H 是一个 struct A1 类型的变量,所以只有在定义好之后才能计算这个结构体占用的内存的大小,
         那么我们在定义H时,它的大小又是多少呢? 我们是不知道的。
         所以无法在一个结构体中定义一个与结构体类型相同的变量。
         因为无论什么类型的指针都占4个字节,所以我们是可以在结构体内,定义一个与结构体同类型的指针。

结构体的内存的对齐的问题

    结构体对齐原则:在结构体内,有大于int类型(或有int类型)的数据时,按4字节进行对齐。
            如果在结构体内,没有大于int类型的数据时,按最大的那个类型进行对齐

    #include <stddef.h>
    size_t offsetof(type , member);
    功能:计算结构体中指定成员,相对于结构体开始地址偏移的字节个数;
    参数:
      @type:结构体
      @member:结构体成员的地址
    返回值:
      成功:返回偏移的字节个数。
     
     
     可以看到字符b占用了两个字节,那是为什么呢?这就是结构体对齐的问题;

点击查看代码
   数据类型:
        char    1个字节
        short   2个字节
        int 和 float   4个字节
        double  8个字节
        指针类型     4个字节

    参考案例:08struct.c
        #include <stdio.h>
        struct aa{
            char a;
            char b;
            char c;
        };
        struct bb{
            char a;  // 1
            char b;  // 1
            char c;  // 1
            // 保留一个字节
            short d; // 2
        };
        struct cc{
            char a;  // 1
            char b;  // 1
            char c;  // 1
            // 保留一个字节
            short d; // 2
            // 保留2个字节
            int  e;   // 4
        };
        struct dd{
            char a;  // 1
            char b;  // 1
            char c;  // 1
            // 保留一个字节
            short d; // 2
            // 保留2个字节
            int e;   // 4
            double f;  // 8
        };

posted @ 2022-06-27 14:52  皆为过客  阅读(307)  评论(0)    收藏  举报