Python 结构体

发布于 2021-05-18 12:15:36 字数 6760 浏览 2195 评论 0

一、结构体声明

struct 结构体名称{
  结构体成员1;
  结构体成员2;
  结构体成员3;
 };

 eg:
 struct Book{
  char title[128];
  char author[40];
  float price;
  unsigned int date;
  char publisher[40];
 };

二、定义结构体类型变量

struct 结构体名称 结构体变量名
eg:struct Book book;

还可以在声明的时候直接定义

struct Book{
  char title[128];
  char author[40];
  float price;
  unsigned int date;
  char publisher[40];
} book;//注意这里有一个分号

三、访问结构体变量

要访问结构体成员,我们需要引入一个新的运算符号 点号 . 运算符。比如 book.title 就是引用 book 结构体的 title 成员,它是一个字符数组;而 book.price 则是引用 book 结构体的 price 成员,它是一个浮点型的变量。

struct Book{
  char title[128];
  char author[40];
  float price;
  unsigned int date;
  char publisher[40];
} book;//注意这里有一个分号

int main(){
  //struct Book book;这里是定义结构体类型变量的另一种方式
  printf("请输入书名:");
  scanf("%s",book.title);
  printf("请输入作者:");
  scanf("%s",book.author);
  printf("请输入售价:");
  scanf("%f",&book.price);
  printf("请输入出版日期:");
  scanf("%d",&book.date);
  printf("请输入出版社:");
  scanf("%s",book.publisher);

  printf("数据录入完毕!\n");

  printf("书名:%s\n",book.title);
  printf("作者:%s\n",book.author);
  printf("售价:%.2f\n",book.price);
  printf("出版日期:%d\n",book.date);
  printf("出版社:%s\n",book.publisher);
  return 0;
}

四、初始化结构体变量

初始化一个变量和数组:
 int a = 520;
 int arr[5] = {1,2,3,4,5}

 初始化一个结构体变量:
 struct Book book = {
  "《带你学C带你飞》",
  "小甲鱼",
  48.8,
  20171111,
  "清华大学出版社"
 };

五、初始结构体的指定原值

其语法和数组制定初始化元素类似,不过结构体指定初始化成员使用点号(.)运算符和成员名

 比如我们可以让程序只初始化Book的price成员:
 struct Book book = {.price = 48.8};

 还可以不按结构体声明的成员顺序进行初始化:
 struct Book book = {
  .publisher = "清华大学出版社",
  .price = 48.8,
  .date = 20171111
 }

六、算一算

int main(){
  struct A{
    char a;
    int b;
    char c;
  } a = {'x',520,'0'};

  printf("size of a = %d\n",sizeof(a));//size of a = 12
  return 0;
}
//不应该是1+4+1=6吗?怎么会是12
//这是编译器对结构体的成员进行内存对齐后的结果。
//说白了,内存对齐就是让CPU可以更快的读取和处理数据的方式。

int main(){
  struct A{
    char a;
    char c;
    int b;
  } a = {'x','0',520};

  printf("size of a = %d\n",sizeof(a));//size of a = 8
  return 0;
}

七、结构体嵌套

struct Date{
  int year;
  int month;
  int day;
};
struct Book{
  char title[128];
  char author[40];
  float price;
  struct Date date;//一个结构体作为另外一个结构体的成员
  char publisher[40];
} book1 = {
  "《带你学C带你飞》",
  "小甲鱼",
  48.8,
  {2017,11,11},
  "清华大学出版社"
};

int main(){
  printf("书名:%s\n",book1.title);
  printf("作者:%s\n",book1.author);
  printf("售价:%.2f\n",book1.price);
  printf("出版日期:%d-%d-%d\n",book1.date.year,book1.date.month,book1.date.day);
  printf("出版社:%s\n",book1.publisher);
  return 0;
}

八、结构体数组

第一种方法是在申明结构体的时候进行定义

 struct 结构体名称{
 结构体成员;
 } 数组名[长度];

第二种方法是先申明一个结构体类型(比如上面Book),在用此类型定义一个结构体数组

struct 结构体名称{
  结构体成员;
};
struct 结构体名称 数组名[长度];

初始化结构体数组:

struct Book{
  char title[128];
  char author[40];
  float price;
  unsigned int date;
  char publisher[40];
};

struct Book book[3] = {
  {"《零基础入门学习Python》","小甲鱼",49.5,20161111,"清华大学出版社"},
  {"《零基础入门学习Scratch》","不二如是",49.9,2017101,"清华大学出版社"},
  {"《带你学C带你飞》","小甲鱼",49.5,20171111,"清华大学出版社"}
}

九、结构体指针

指向结构体变量的指针叫做结构体指针。

 struct Book *pt;
 pt = &book;

 通过结构体指针访问结构体成员又两种方法:
 第一种:(*结构体指针).成员名
 第二种:结构体指针->成员名

十、传递结构体变量

int main(){
  struct Test{
    int x;
    int y;
  } t1,t2;
  t1.x = 3;
  t1.y = 4;

  t2 = t1;//两个结构体变量之间是可以相互赋值的,但是结构体类型必须一样

  printf("t2.x=%d,t2.y=%d",t2.x,t2.y);
  return 0;
}
struct Date{
  int year;
  int month;
  int day;
};
struct Book{
  char title[128];
  char author[40];
  float price;
  struct Date date;
  char publisher[40];
};
struct Book getInput(struct Book book){
  printf("请输入书名:");
  scanf("%s",book.title);
  printf("请输入作者:");
  scanf("%s",book.author);
  printf("请输入售价:");
  scanf("%f",&book.price);
  printf("请输入出版日期:");
  scanf("%d-%d-%d",&book.date.year,&book.date.month,&book.date.day);
  printf("请输入出版社:");
  scanf("%s",book.publisher);
  return book;
}

void printBook(struct Book book){
  printf("书名:%s\n",book.title);
  printf("作者:%s\n",book.author);
  printf("售价:%.2f\n",book.price);
  printf("出版日期:%d-%d-%d\n",book.date.year,book.date.month,book.date.day);
  printf("出版社:%s\n",book.publisher);
}

int main(){
  struct Book b1,b2;

  printf("请输入第一本书的信息...\n");
  b1 = getInput(b1);

  printf("请输入第二本书的信息...\n");
  b2 = getInput(b2);

  printf("录入完毕,现在开始打印验证...\n\n");

  printf("打印第一本书的信息...\n");
  printBook(b1);

  printf("\n\n");

  printf("打印第二本书的信息...\n");
  printBook(b2);
  return 0;
}

十一、传递指向结构体变量的指针

struct Date{
  int year;
  int month;
  int day;
};
struct Book{
  char title[128];
  char author[40];
  float price;
  struct Date date;
  char publisher[40];
};
void getInput(struct Book *book){
  printf("请输入书名:");
  scanf("%s",book->title);
  printf("请输入作者:");
  scanf("%s",book->author);
  printf("请输入售价:");
  scanf("%f",&book->price);
  printf("请输入出版日期:");
  scanf("%d-%d-%d",&book->date.year,&book->date.month,&book->date.day);
  printf("请输入出版社:");
  scanf("%s",book->publisher);
}

void printBook(struct Book *book){
  printf("书名:%s\n",book->title);
  printf("作者:%s\n",book->author);
  printf("售价:%.2f\n",book->price);
  printf("出版日期:%d-%d-%d\n",book->date.year,book->date.month,book->date.day);
  printf("出版社:%s\n",book->publisher);
}

int main(){
  struct Book b1,b2;

  printf("请输入第一本书的信息...\n");
  getInput(&b1);

  printf("请输入第二本书的信息...\n");
  getInput(&b2);

  printf("录入完毕,现在开始打印验证...\n\n");

  printf("打印第一本书的信息...\n");
  printBook(&b1);

  printf("\n\n");

  printf("打印第二本书的信息...\n");
  printBook(&b2);
  return 0;
}

十二、动态申请结构体

使用 malloc 函数为结构体分配存储空间。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84960 人气
更多

推荐作者

linfzu01

文章 0 评论 0

可遇━不可求

文章 0 评论 0

枕梦

文章 0 评论 0

qq_3LFa8Q

文章 0 评论 0

JP

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文