《C语言教程》21章 结构体

[复制链接]
1022|5
 楼主| niuyaliang 发表于 2015-3-17 20:50 | 显示全部楼层 |阅读模式

好久不看C语言的书了,许多名词与以前也不一样了。以前小雅的老师把现在要讲的这一章叫“结构体”,现在的新书上叫“构造体”,小雅比较怀旧,仍称之为“结构体”。

结构体就是将几个类型的数据结合成一个类型的数据来处理,例如图书馆管理书籍,一本书总是包含编号、书名、单价等内容,于是把编号、书名、单价结合成一个类型,当然这样的数据类型是自定义的数据类型,这就是结构体。注意:结构体是数据类型,而不是变量,必须在程序中定义了该类型的就是后才能操作数据。


 楼主| niuyaliang 发表于 2015-3-17 20:50 | 显示全部楼层
一、结构体的基本使用
结构体的使用要注意以下几个方面:
结构体的标记名不是变量,它和struct连用才表示自定义的数据类型。
用结构体定义的变量可以是一般变量,也可以是数组或指针。
一般变量和数组操作元素时用“.”,指针操作元素时用“->”。
结构体的元素可以是任何数据类型,包括自定义的结构体类型。
结构体的元素虽可以是指针,但极易造成内存泄漏,宜慎用。
结构体数组变量名可以当作地址,普通变量名不能当作地址,必须前置“&”。
元素的地址要看其类型,基本类型时同样要使用“&”。
 楼主| niuyaliang 发表于 2015-3-17 20:51 | 显示全部楼层

  1. #include <stdio.h>
  2. #include <string.h>

  3. //结构体的定义
  4. struct BOOK {
  5.     char  id[4];       //编号
  6.     char  name[64];    //书名
  7.     float price;       //单价
  8. };

  9. int main(void)
  10. {
  11.     //结构体也可以初始化时直接赋值
  12.     struct BOOK clang = {"101", "劝学网的C语言教程", 25.5};
  13.     struct BOOK books[2];
  14.     struct BOOK *p;

  15.     //变量或数组对结构体元素的赋值
  16.     strcpy(books[0].id, "201");
  17.     strcpy(books[0].name, "劝学网的Oracle教程");
  18.     books[0].price = 35.5;

  19.     //指针对结构体元素的赋值
  20.     p = books + 1;
  21.     strcpy(p->id, "202");
  22.     strcpy(p->name, "小雅的Java教程");
  23.     p->price = 45.5;

  24.     //显示结构体变量的内容
  25.     printf("%s, %s, %f\n", clang.id, clang.name, clang.price);
  26.     printf("%s, %s, %f\n", books[0].id, books[0].name, books[0].price);
  27.     printf("%s, %s, %f\n", p->id, books[1].name, (books+1)->price);

  28.     return 0;
  29. }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| niuyaliang 发表于 2015-3-17 20:51 | 显示全部楼层
二、结构体作参数和返回值
下面例子分别演示结构体变量、指针在作参数和返回值时的各种情况。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. struct p_type {
  5.     char id[4];       //编码
  6.     char name[16];    //姓名
  7. };

  8. //结构体变量作参数
  9. void setByVar(struct p_type per) {
  10.     strcpy(per.id, "202");
  11.     strcpy(per.name, "张展");

  12.     return ;
  13. }

  14. //结构体指针作参数
  15. void setByAdd(struct p_type *per) {
  16.     strcpy(per->id , "303");
  17.     strcpy(per->name, "张腾");

  18.     return ;
  19. }

  20. //结构体变量作返回值
  21. struct p_type setNewByVar() {
  22.     static struct p_type zh;   //一定要是静态变量才能作为返回值

  23.     strcpy(zh.id, "404");
  24.     strcpy(zh.name, "张翅");

  25.     return zh;
  26. }

  27. //结构体指针作返回值
  28. struct p_type *setNewByAdd() {
  29.     struct p_type *p;

  30.     p = (struct p_type *)malloc(sizeof(struct p_type));
  31.     strcpy(p->id, "505");
  32.     strcpy(p->name, "张去");

  33.     return p;
  34. }

  35. void print(const struct p_type *per) {
  36.     printf("%s, %s\n", per->id, per->name);

  37.     return
  38. }

  39. int main(void)
  40. {
  41.     struct p_type zhang, *p, tmp;

  42.     //变量中的初始值
  43.     strcpy(zhang.id, "101");
  44.     strcpy(zhang.name, "张飞");

  45.     //用变量直接作参数,值不能被修改
  46.     setByVar(zhang);
  47.     print(&zhang);    //结果:101, 张飞

  48.     //用指针直接作参数,值可以被修改
  49.     setByAdd(&zhang);
  50.     print(&zhang);    //结果:303, 张腾

  51.     //用变量直接作返回值,OK
  52.     tmp = setNewByVar();
  53.     print(&tmp);      //结果:404, 张翅

  54.     //用指针直接作返回值,OK
  55.     p = setNewByAdd();
  56.     print(p);         //结果:505, 张去
  57.     free(p);          //释放内存不能忘记

  58.     return 0;
  59. }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| niuyaliang 发表于 2015-3-17 20:52 | 显示全部楼层
三、结构体的位字段(BitField)
当结构体中的元素的取值范围很小时,可以将几个字段按位合成一个字段来表示,起到节省内存空间的作用。

  1. #include <stdio.h>
  2. #include <string.h>

  3. struct b_type {
  4.     unsigned char depart: 3 ;   //部门(最大7个部门)
  5.     unsigned char sex: 1 ;      //性别
  6.     unsigned char reason: 2 ;   //理由(共4个)
  7. };

  8. void print(struct b_type *rea) {
  9.     char dep[7];
  10.     char sex[3];
  11.     char res[5];

  12.     switch (rea->depart) {
  13.         case 1:
  14.             strcpy(dep,"财务科");
  15.             break;
  16.         case 2:
  17.             strcpy(dep,"开发科");
  18.             break;
  19.         case 3:
  20.             strcpy(dep,"检测科");
  21.             break;
  22.         case 4:
  23.             strcpy(dep,"生产科");
  24.             break;
  25.         default:
  26.             break;
  27.     }

  28.     switch (rea->sex) {
  29.         case 0:
  30.             strcpy(sex,"男");
  31.             break;
  32.         default:
  33.             strcpy(sex,"女");
  34.             break;
  35.     }

  36.     switch (rea->reason) {
  37.         case 1:
  38.             strcpy(res,"事假");
  39.             break;
  40.         case 2:
  41.             strcpy(res,"病假");
  42.             break;
  43.         case 3:
  44.             strcpy(res,"婚假");
  45.             break;
  46.         default:
  47.             strcpy(res,"无故");
  48.             break;
  49.     }

  50.     printf("%s, %s, %s\n", dep, sex, res);

  51.     return ;
  52. }

  53. int main(void)
  54. {
  55.     struct b_type staff;

  56.     staff.depart = 2;
  57.     staff.sex = 0;
  58.     staff.reason =4;

  59.     printf("staff的长度:%d\n", sizeof(struct b_type));
  60.     print(&staff);

  61.     return 0;
  62. }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| niuyaliang 发表于 2015-3-17 20:53 | 显示全部楼层
四、没有标记名的结构体
C语言同样允许没有标记名的结构体。

  1. #include <stdio.h>
  2. #include <string.h>

  3. int main(void)
  4. {
  5.     struct {
  6.         char id[4] ;       //编码
  7.         char name[16] ;    //姓名
  8.     } staff, *p;

  9.     strcpy(staff.id, "101");
  10.     strcpy(staff.name, "后羿");
  11.    
  12.     p = &staff ;

  13.     printf("%s, %s\n", p->id, p->name);

  14.     return 0;
  15. }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部