(1)typedef关键字和结构体
typedef用来定义新的数据类型,通常typedef与结构体或枚举的定义配合使用。使用typedef的目的使结构体的表达更加简练。个人认为typedef不是必须使用的,但是精炼了代码。
a)typedef定义数据类型
typedef int integer;
integer a,b;
b)定义一个结构体GPIO_InitTypeDef:
struct GPIO_InitTypeDef
{
uint16_t GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
};
给结构体起一个别名为 GPIO_Initstruct
typedef struct GPIO_InitTypeDef GPIO_Initstruct
利用typedef关键字可以直接写成:
typedef struct
{
uint16_t GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
}GPIO_InitTypeDef;
故GPIO_InitTypeDef为结构体,可接将typedef struct GPIO_InitTypeDef GPIO_Initstruct该写为GPIO_InitTypeDef GPIO_Initstruct。
struct stu
{
char a;
int b;
}name[3],*p,people//name[3]为结构体数组,*p为结构体指针,name为结构体变量
引用时:name[0].a或name[2].b或p->b或people.a
(2)#define和typedef的区别
typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名,它并不实际分配内存空间。
typedef不是简单替换 ,而是采用如同定义变量的方法那样来声明一种类型。
#define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),即宏定义,它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了。
例如:
#define PI 3.1415926
程序中的:area=PI*r*r 会替换为3.1415926*r*r
如果你把#define语句中的数字9 写成字母g 预处理也照样带入。
typedef int* int_ptr 表面上功能上等同 #define int_ptr int*,但
#define int_ptr int *
int_ptr a, b; //相当于int * a, b; 只是简单的宏替换,同时define不是句子,不加分号。
typedef int* int_ptr;
int_ptr a, b; //a, b 都为指向int的指针,typedef为int* 引入了一个新的助记符
(3)枚举型enmu
枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为
typedef enum
{ Bit_RESET = 0,
Bit_SET
}BitAction;//BitAction为枚举型
enum [DAY]
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY tomorrow; //变量tomorrow的类型为枚举型enum DAY
enum DAY happy, angry; //变量happy和angry的类型均为枚举型enum DAY
或:
enum
{
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} workday; //变量workday的类型为枚举型enum DAY
或用typedef关键字将枚举类型定义成别名,并利用该别名进行变量声明:
typedef enum workday
{
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} work; //此处的work为枚举型enum workday的别名
a) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,不能在程序中用赋值语句赋值;元素之间用逗号“,”隔开。
b) DAY是一个标识符,即集合的名字,是一个可选项,即是可有可无的项。
c) 第一个枚举成员的默认值为整型的0,下面枚举成员的值依次+1。
d) 可以人为设定枚举成员的值,从而自定义某个范围内的整数。
e) 枚举型是预处理指令#define的替代。
f) 类型定义以分号“;”结束。
(4)共同体union
不同类型的变量存放到同一段内存单元中,即覆盖技术,使几个变量互相覆盖。这几个不同的变量共同占用一段内存结构,即共用体。
union data
{
成员列表
}变量表列;
如:
union data
{
int i;
char ch;
float f;
}a,b,c; //和结构体,枚举的表示一致;
若有以下赋值:
a.i=1;
a.ch=9;
a.f=10.3;
注意,完成上诉的赋值,只有a.f=10.3是有效的,a.i和a.ch是无效的。
共同体地址和它的各成员地址都是同一地址。
a)共同体在任意时刻只存在一个成员。
b)共同体变量分配内存长度为最长成员所占字节数。
c)共同体和结构体可以互相嵌套。
d)共同体虽然省内存,但是数据容易覆盖,一旦出现覆盖,程序就会出现错误。
『文末说明』
本文作者:小强子
知乎ID:Power小强
一个细腻不油腻,嗜好多能力小的普通人,专注于分享电子电气相关知识的打杂硕士生