结构体

1、结构体类型的声明

结构体是一些值的集合,这些值称为成员变量

结构体的每个成员可以是不同类型的变量。

结构体的声明:

#include <stdio.h>
struct Book
{
  char name[5];
  int id;
  float price;
};

struct Student
{
  struct Book book;
  //成员变量
  char name[20];
  int age;
  char sex[5];
} s1, s2; //s1和s2也是结构体变量,不过是全局变量
int main()
{
  struct Student s; //创建对象,局部变量

  return 0;
}

结构体成员的类型:可以是标量、数组、指针,甚至是其他结构体

2、结构体初始化

struct Student s = {{"book", 12345, 88.88}, "lisa", 18, "female"};

3、结构体成员访问

 用.->访问

printf("%s\n", s.book.name);
struct Student *ps = &s;
printf("%s\n", (*ps).name);
printf("%s\n", ps->name);

4、结构体传参

void print1(struct Student t)
{
  printf("%s %d %lf %s %d %s\n", t.book.name, t.book.id, t.book.price, t.name, t.age, t.sex);
}
void print2(struct Student *ps)
{
  printf("%s %d %lf %s %d %s\n", ps->book.name, ps->book.id, ps->book.price, ps->name, ps->age, ps->sex);
}
int main()
{
  //写一个函数打印s里的内容
  print1(s); //传值调用
  print2(&s); //传址调用--效率高,节约空间,可以改s中的数据
  //首选print2函数,原因:函数传参的时候,参数需要压栈。如果传递一个结构体对象,结构体过大,参数压栈的系统开销比较大,导致性能的下降
  //结论:结构体传参的时候,要传递结构体的地址
}