stdint.h(stdint关键字):

Q:为什么要有Stdint来划分(别名)C语言的标准数据类型?
A:解决跨平台和编译器的不一致性,提供明确的位宽和表示范围,提高代码可维护性。
stdint.h提供了一组具有固定宽度的整数类型,这些类型的名称和大小是标准的,因此它们在不同的编译器和平台上具有一致性。
这种明确的位宽和表示范围有助于程序员在编写程序时能够准确地指定所使用的整数类型的大小和范围。
程序员可以编写出更加精确和可移植的代码。这些类型名称具有明确的含义,能够清晰地表达程序员的意图。
另外,数据类型别名有助于消除歧义。比如char类型意思是一个字符,但是在单片机领域char往往指的是一个8位有符号数字。

其原理是使用typedef关键字对C语言基本数据类型设置别名。
typedef char int8_t;
typedef unsigned char int8_t;
typedef unsigned short uint16_t;
…… 

宏定义:
宏替换是简单的文本替换。

预处理器不会检查宏替换后的代码是否合法或有效,它只是简单地将宏名称替换为相应的替换文本。
宏定义没有存储期,因为它只是文本替换,不涉及变量的存储。
宏定义的作用域是全局的(除非在文件内部使用#undef来取消定义),但可以通过条件编译来限制其作用范围。

结构体(struct):
结构体是用户自定义的组合数据类型。 定义结构体:

Ⅰ. 只定义一个/少量结构体变量:
struct{char name[50], int age, float weight} user1;
Ⅱ. 用typedef把一个结构体做成原型,方便定义大量同结构结构体(后续代码默认用这种方式!):
typedef struct{char name[50], int age, float weight} user;
……
user user1;
Ⅲ. 做成原型,但不用typedef:
struct{char name[50], int age, float weight} user;
……
struct user user1;

使用结构体:

Ⅰ. 结构体名.内部变量名
user1.name="Elysia"; user1.age=18; user1.weight=54.8;
Ⅱ. 结构体指针->内部变量名
user *puser1 = &user1;    // puser1是结构体变量user1的首地址
puser1->name="Elysia"; puser1->age=18; puser1->weight=54.8;

枚举(enum):