一、结构体
  在前面的数组分享中,把同一类型的数据进行保存通过数组,我们可以用数组来表示这个整体,但是数组有个特点:内部的每一个元素都必须是相同类型的数据。那么如何通过一个方式将不同类型的数据进行存储呢?
  为此,C语言专门提供了一种构造类型来解决上述问题,这是结构体,它允许内部的元素是不同类型的。
  二、结构体的定义
  1.先定义结构体类型, 在定义结构体变量
  struct student {
  int age ;
  char *name;
  double height;
  };
  struct student sd;
  2.定义结构体类型的同时定义结构体变量
  struct student2{
  int age;
  char *name;
  double height;
  }sd2;
  sd2.age = 16;
  sd2.name = “JAMES”;
  sd2.height = 1.9;
  3.定义结构体类型的同时定义结构体变量, 并且省略结构体名称
  struct {
  int age;
  char *name;
  double height;
  }sd3;
  sd3.age = 17;
  sd3.name = “james”;
  sd3.height = 1.88;
  定义结构体类型的同时定义结构体变量, 并且省略结构体名称的注意:
  弊端: 由于结构体类型没有名称, 所以以后不能使用该结构体类型
  优点: 如果结构体类型只需要使用一次, 那么可以使用该方式
  三、结构体初始化
  1.定义的同时初始化
  struct student sd = {18,”james”,1.87};
  2.先定义后初始化(一次性初始化)
  struct student sd2;
  sd2 = (struct student){18,”james”,1.98};
  3.先定义再初始化(逐个初始化)
  struct student sd3;
  sd3.name = “james”;
  sd3.age = 18;
  sd3.height = 1.87;
  4.指定将数据赋值给指定的属性
  struct student sd4 = {.height = 1.76,.age = 19,.name = “james”};
  四、结构体数组
  跟结构体变量一样,结构体数组也有3种定义方式:
  方式一:
  struct Student {
  char *name;
  int age;
  };
  struct Student stu[5]; //定义1
  方式二:
  struct Student {
  char *name;
  int age;
  } stu[5]; //定义2
  方式三:
  struct {
  char *name;
  int age;
  } stu[5]; //定义3
  结构体数组的初始化:
  truct {
  char *name;
  int age;
  } stu[2] = { {“Jmes”, 21}, {“JJ”, 30} };
  五、结构体函数
  将结构体变量作为函数参数进行传递时,其实传递的是全部成员的值,也是将实参中成员的值一一赋值给对应的形参成员。因此,形参的改变不会影响到实参。相当于拷贝。
  // 定义一个结构体
  struct Student {
  int age;
  };
  void test(struct Student stu) {
  printf(“修改前的形参:%d ”, stu.age);
  // 修改实参中的age
  stu.age = 10;
  printf(“修改后的形参:%d ”, stu.age);
  }
  int main(int argc, const char * argv[]) {
  struct Student stu = {30};
  printf(“修改前的实参:%d ”, stu.age);
  // 调用test函数
  test(stu);
  printf(“修改后的实参:%d ”, stu.age);
  return 0;
  }