这是本主题的第二篇文章,主要就结构体,枚举、联合体做一些解释

1.结构体

现代C语言编程 结构化的基石,diy时代的最好代言人,是面向对象编程中类的老祖宗。

我们很容易定义一个结构体,比如学生:

struct student
{
char * name;
int number;
};

在前文中,我们介绍了typedef 的用法,这里,我们可以使用该关键词声明一个学生结构体变量

typedef struct student stu_st;

在使用该结构体的地方都可以使用stu_st 代替:

struct student Stultz;

---> stu_st Stultz

以下是一些需要注意的位置:

  • sizeof 某个结构体时 ,会涉及到字节对齐,这里的原因与硬件有关,一般来说,结构体都是4字对齐的,所以,结构体不同的成员的先后顺序会影响结构体的大小,这一点,如果有不清楚的,可以自行百度下。
  • 结构体长度计算 sizeof(sts)/sizeof(sts[0])//sts为一个结构体数组

2.联合

这是个很尬尴的存在,可能是我做的工作比较低端,我使用联合很少,最多是在判断大小端时使用了联合的。但是,我知道,在嵌入式领域,对于空间敏感的地方会使用较多的联合,但是现在手机都快8G运存了,哎!

以下是书中归纳的联合与结构体的区别:

联合本质上是一个成员相互重叠的结构,某一时刻 你只能使用一个成员(也可以从一个成员写入,然后从另一个成员读出,来检查某种类型的二进制模式,或者用不同的方法解释他们,但很明显,这样跟机器紧密相关)。联合的大小是他的最大成员的大小,二结构的大小是成员大小之和。

3.枚举

枚举和#define 只有很小的区别,C标准表明枚举是整形,枚举常量是int型的,因此他们都可以和其他整型类别自由混合而不会出错,

枚举的优点 :自动赋值。

一个例子,说明三者如何玩起来

#include <stdio.h>
#include <stdlib.h> struct student;
struct action;
typedef void (*action_pf)();//函数指针类型声明
typedef struct student //学生结构体
{
char* name;
int num;
}stu_ST; //枚举学生行为
typedef enum {UNKOWN,DOEXAM,DOSTUDY,ACTION_NULL} actionCode; //行为枚举与行为函数的对应结构体
typedef struct type_2_action
{
actionCode actionType;
action_pf pf;
}typeAction_ST; //行为函数
void do_exam(stu_ST* su)
{
printf("the No.%d student %s is examing\n",su->num,su->name);
} void do_study(stu_ST* su )
{
printf("the No.%d student %s is studying\n",su->num,su->name);
} //关联结构体初始化
typeAction_ST ac[] = {
{DOEXAM,do_exam},
{DOSTUDY,do_study}
};
int main()
{
stu_ST st = {"stultz Lee",1};//一个学生结构体的初始化
int i = 0;
//当行为类型为DOEXAM时,执行该函数
for (;i < sizeof(ac)/sizeof(ac[0]);++i)
{
if(ac[i].actionType == DOEXAM)
ac[i].pf(&st);
} return 0;
}

输出结果:the No.1 student stultz Lee is examing

说明:以上代码 很刻意地使用了文中提到的所有内容,仅供参考。实际编码比这段代码要精炼些。有机会会列出来。

最新文章

  1. 关于linux服务器上搭建ftp服务的流程
  2. Native VS H5 VS React Native
  3. Mac下配置环境变量
  4. android架构介绍
  5. C# 生成二维码并且在中间加Logo
  6. Nodejs in Visual Studio Code 13.构建单页应用Scrat示例挖一挖
  7. windows服务安装(System.ComponentModel.Win32Exception:远程过程调用失败)
  8. 设计模式 ( 二十一 ):Vistor访问者模式 -- 行为型
  9. 使用runtime 实现weex 跳转原生页面
  10. TTL电平与RS232电平的区别
  11. Effective JavaScript :第一章
  12. 简单介绍 CPU 的工作原理
  13. Kali Linux的vi编辑器/vim编辑器使用方法
  14. libopencv_highgui.so.2.4.9:对‘TIFFReadRGBAStrip@LIBTIFF_4.0’未定义的引用
  15. C#扩展方法实现
  16. Google - chanceToLose24Game
  17. python全栈开发笔记---基本数据类型--数字型魔法
  18. [转]网页实时聊天之js和jQuery实现ajax长轮询 PHP
  19. Android Activity之间切换出现短暂黑屏的处理方法
  20. 《Lua程序设计》第5章 函数 学习笔记

热门文章

  1. Linux系统配置VI或VIM的技巧
  2. maven的相关命令
  3. HackerRank - powers-game-1 【博弈论】
  4. POJ - 1904 King&#39;s Quest (强连通)
  5. Asp.Net MVC4+EF6 Code First 权限管理系统 源码下载
  6. 存储库之mongodb,redis,mysql
  7. 编写Tesseract的Python扩展
  8. Hungry Rabbit
  9. DCU IP Prefether
  10. PAT1077. Kuchiguse (20)