结构体

定义:

  结构(structure) 或叫 结构体

  "结构"是一种构造类型,它是由若干"成员"组成的,每一个成员可以是一个基本数据类型或者又是一个构造类型.

      结构既是一种"构造"而成的数据类型,那么在说明和使用之前必须先定义它,也就是构造它,如同在说明和调用函数之前要先定义函数一样

为什么要有结构体?

  结构体可以把功能相同的数据组织起来,存在一起,用得时候方便.而且在调用函数时,若传递参数较多,传一个结构体相对而言简单一些,很多系统自带的函数必须用结构体

定义结构体的方法

 定义一个结构的一般形式为:
    struct 结构名{
          成员列表     
    };

例: 定义一个学生的结构
    struct stu{
        int num;
        char  name[10];  //char *name;
    

    };       

结构体变量的定义有三种方法

1)先定义结构体,然后在定义结构体变量

    struct Student{
//学生学号
      int sno;
      //学生名称
      char name[20];
      //学生年龄
      int age;
      //学生成绩
      float score;
    };
    //注意:
     结构体定义完成以后,计算机并不会给结构体分配内存空间
     会在定义结构体变量后,分配存储空间

    //结构体变量定义格式:
      struct 结构体名 结构体变量名;
struct Student stu1;
2)定义结构体的同时,定义结构体变量

   格式:
    struct 结构体名{

    }结构体变量1,结构体变量2...;

3)使用匿名结构体定义结构体变量

  struct{
  
  }结构体变量1,结构体变量2....;

结构体变量中成员的访问

  形式:
    结构变量名.成员名

结构体变量初始化

struct Student{
    
      int sno;
      char name[21];
      int age;
      float score;
};
初始化:
     1):  
       struct Student str;
       str.sno=1;
       str.name="abc" //这种方式是错误的
       strcpy(str.name,"abc");
       str.score = 59.99f
    
      2):
      定义结构体变量的同时,进行初始化
      初始化值的顺序要和定义结构体的顺序一致
      struct Student  stu2 ={8,"哈哈",2,4.5f}



问题:
    1.stu1.name 占用多少个字节
      printf("%d
",sizeof(stu1.name));  //21
    2.stub.name 字符串长度是多少
       printf("%ld",strlen(stu1.name));   //9

    //汉字的编码问题
    //utf-8   xcode中默认的中文的编码是utf-8 ,国际通用编码, 一个汉子占用3个字节
    //GB2312 GBK 国标 一个汉字占用2个字节


      

结构体存储原理

  结构体占用的内存空间是每个成员占用的字节数之和(考虑对齐问题);

结构体大小的计算方法和步骤

  

    1)将结构体内所有数据成员的长度相加,记为sum_a;
    2)将各数据成员为了内存对齐,按各自对齐模数而填充的字节数累加到和sum_a上,记为sum_b。对齐模数是#pragma pack 指定的数值以及该数据成员自身长度中数值较小者.该数据相对起始位置应该是对齐模式的整数倍
     3)将和sum_b向结构体模数对齐,该模数是#pragma pac指定的数值和结构体内部最大的基本数据类型成员长度中数值较小者.结构体的长度应该是该模数的整数倍

    所谓"对齐在N上" ,指定是"存放起始地址%N=0"
    struct A{
          int a;         //4
          char b;      //分配4个,用了1个,剩下3个
          short c;    //需要2个
    };        

    printf("%ld
",sizeof(stuct A));

   //上面的话是书上的
   // 1)找对齐模数
   //      对齐模数: 是结构体中的基本数据类型中占用字节数最大的那个
   // 2)在计算结构体变量中各个成员占用的字节和

枚举也是一种结构体

枚举:
    枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解任何基本类型
 格式:
    enum 枚举类型{枚举值1,枚举值2....}
 
 枚举变量的值:
    枚举类型定义完成以后,系统会自动给枚举的每个元素都会赋值一个整形的初值
    初值:从第一个元素开始,值为0,后面元素的值是其上一个元素值+1;

  

原文地址:https://www.cnblogs.com/developer-wang/p/4490960.html