结构体学习笔记

  • 关于结构体的构成
struct Student    //结构体类型名=struct+结构体名    struct Student也可以认为是结构体的类型
{
    //以下被称为是成员列表(成员列表也被称之为是域表)
    //各个成员组成一个结构体,一个成员也称为是结构体中的一个域
    int num;    //成员=类型名(int)+成员名(num)
    char name[20];
    char sex;
    int age;
    float score;
    char addr[30];
}student;        //结构体变量名
  • 结构体的变量名若在结构体中定义,则有以下两段代码等价:

    • 代码段1

      struct Student
      {
          ···
      }student;
      
      int main(void)
      {
          ···        //主函数中无需再定义结构体变量student即可直接使用该结构体变量
      }
      
    • 代码段2

      struct Student
      {
          ···
      };
      
      int main(void)
      {
          struct Student student;     //但一般情况下定义完结构体类型后还有在主函数中定义结构体变量
      }
      
  • 关于结构体其他的一些非正常的使用方法

//结构体允许不命名类型名,但在不命名类型名时必须要有结构体变量名
struct
{
    int title;
    int author;
    int value;
}student;
//此时这段代码的效用与上文所提到的代码段1的效用相同
//但如果这样直接定义结构体变量会降低结构体的可复用性,而我认为可复用性是结构体的最大特性,这样一种使用结构体的方式在我看来可以说是一种剥夺了结构体灵魂的行为
  • 关于结构体数组在内存中的存储方式(C Prime Plus)

image-20201222203330417

  • 关于箭头的使用:地址->结构成员,其等价于(*地址).结构成员

    • 点运算符与箭头运算符的区别
  • 结构体在传入自定义函数时只传值,与数组不同,与基本数据类型类似

  • 对于结构体类型名称的命名建议使用首字母大写的单词(#define语句的变量命名建议使用纯大写字母所构成的单词,主函数中的变量命名建议使用纯小写字母所构成的单词)

  • 关于typedef的使用:

    • typedef (原类型名) (自定义新名称)

    • typedef可以重命名任一类型(比如int、long、short、double等)

    • 也可以对结构体使用 typedef 来定义一个新的数据类型名称(也就是起别名);

    • 需要注意的是,在使用typedef简化结构体命名的情况下,不可以直接在定义结构体的函数中再去定义结构体变量名

      例:
      typedef struct Student
      {
          ···
      }student;
      //student(注意:首字母小写,不是结构体名Student)在代码段1里是结构体变量名
      //但在这段代码里student则是struct Student的别名
      
  • 疑问:结构体的变量名在本质上是一种地址吗?

  • 待解决:结构体指针、深入理解结构体