第十二章、结构体(附枚举类型)
本章是非常重要的一章,结构体的概念与实际意义与C++里类的概念有几分相近,都是是一类相关联数据的集合。用示例来解释会较为清晰,以串口参数为例,串口的配置有许多参数,但基本包括以下4个:1)串口波特率;2)串口停止位;3)串口传送位数;4)奇偶校验位。我们在配置过程如果声明四个变量,在初始化时依次调用——这个思路肯定没有问题,程序也是能成功初始化并跑通。只是这并不符合编程习惯,当然也因为我们有更好的——结构体变量。
结构的声明需要使用struct关键字,示例如下:
struct _tUartParam
{
uint16_t band;
uint8_t stop;
uint8_t frameBits;
uint8_t check;
};
struct tUartParam uart1;
上面的示例,我们就声明了变量uart1。结构体的变量初始化过程就是对结构体成员每个变量都进行初始化,现在uart1使用波特率9600,1位停止位,无奇偶校验位,8位字长,示例如下:
Uart1.band = 9600;
Uart1.stop = 1;
Uart1.frameBits = 8;
Uart1.check = 0;
结构体的引用也挺简单的,就是使用“.“号,像上面的示例一样。对于结构体的指针变量,还有另外一种常用的引用方式”->“箭头方式,例如:
struct tUartParam *pUartParam;
pUartParam = &Uart1;
pUartParam->band = 9600;
pUartParam->stop = 1;
……
这一章还讲了typedef关键字,这个也是平时常用的关键字之一。其作用就是声明一个我们自己定义名字的类型,如:
Typedef BYTE char;
这样就声明了一个BYTE类型等同于char型,我们在使用时更加明晰,增强代码的可读性,从而减少误操作的可能性。
还有一个类型“枚举类型”,它只是声明了类型的值域必须为声明的值,不能为其余值,否则会报错。这个典型应用就是有限状态机编程里的状态机的状态值。比如我们生活中最常见的星期表示方法,因为只可能是这七个值,不会出现星期八的情况,因此,枚举值可以完美处理这样的需求。
声明方式:
enum eWeek {SUN, MON, TUE, WED, THUR, FRI, STA};
枚举类型的变量,编译器最后仍然是处理成为整数变量,换句话说,可以对枚举类型的变量进行运算操作,但是我们如果没有特殊要求不要这样设计,建议仅使用赋值语句来实现变量的变更。