你必须知道的495个C语言问题,学习体会二
2017-04-23 16:57
162 查看
这是本主题的第二篇文章,主要就结构体,枚举、联合体做一些解释
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
说明:以上代码 很刻意地使用了文中提到的所有内容,仅供参考。实际编码比这段代码要精炼些。有机会会列出来。
相关文章推荐
- 你必须知道的495个C语言问题,学习体会一
- 你必须知道的495个C语言问题,学习体会四
- 学习笔记_你必须知道的495个C语言问题
- 你必须知道的495个C语言问题-----学习笔记
- 你必须知道的495个C语言问题 (C Programming FAQs) 高清PDF中文版
- C语言零碎记录之strcat【你必须知道的495个C语言问题 电子书下载】
- 你必须知道的495个C语言问题整理一
- 你必须知道的495个C语言问题整理三
- 你必须知道的495个C语言问题 读书笔记
- 你必须知道的495个C语言问题整理二
- 摘自【你必须知道的495个c语言问题】
- 读书笔记之:你必须知道的495个C语言问题
- 你必须知道的495个C语言问题 读书笔记
- 你必须知道的495个C语言问题pdf
- 你必须知道的C语言问题
- 必须弄懂的495个C语言问题
- <你必须知道的495个C语言问题>学习笔记 (一)
- EF学习和使用(八)你必须知道的效率问题根源之Expression<Func<TObject, bool>>与Func<TObject, bool>
- 嵌入式程序员必须知道的16个问题(C语言方面)
- 学习C语言的体会与问题