从单片机基础到程序框架(全集 2019pdf版).pdf - 第312页
二进制:10 分析: GtMould_ 1 所占的字节数 a 为 5。 GtMould_ 2_B 的结构体成 员 GtMould_ 2_B.u32Data 为 1 。 GtMould_ 2_B 的结构体成 员 GtMould_ 2_B.u8Data 为 2。 【71.6 如何在单片机上练习本章节 C 语言程序?】 直接复制前 面章节中第十 一节的模板程 序, 练习代码时只需要 更改 “ C 语言学习区 域” 的 代码就可 以了, 其它 …

struct StructMould_2 GtMould_2_A;
struct StructMould_2 GtMould_2_B;
unsigned long a; //此变量用来获取结构体变量 GtMould_1 所占用的字节总数
void main() //主函数
{
a=sizeof(GtMould_1); //利用宏函数 sizeof 获取结构体变量 GtMould_1 所占用的字节总数
//先给 GtMould_2_A 赋初值。
GtMould_2_A.u32Data=1;
GtMould_2_A.u8Data=2;
//通过“整体赋值”,把结构体变量 GtMould_2_A 赋值给 GtMould_2_B。
GtMould_2_B=GtMould_2_A; //整体之间“一次性”的赋值
View(a); //把 a 发送到电脑端观察
View(GtMould_2_B.u32Data); //把结构体成员 GtMould_2_B.u32Data 发送到电脑端观察
View(GtMould_2_B.u8Data); //把结构体成员 GtMould_2_B.u8Data 发送到电脑端观察
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
第 1 个数
十进制:5
十六进制:5
二进制:101
第 2 个数
十进制:1
十六进制:1
二进制:1
第 3 个数
十进制:2
十六进制:2

二进制:10
分析:
GtMould_1 所占的字节数 a 为 5。
GtMould_2_B 的结构体成员 GtMould_2_B.u32Data 为 1。
GtMould_2_B 的结构体成员 GtMould_2_B.u8Data 为 2。
【71.6 如何在单片机上练习本章节 C 语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C 语言学习区域”的代码就可以了,
其它部分的代码不要动。编译后,把程序下载进带串口的 51 学习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。

第七十二节: 结构体的指针。
【72.1 结构体指针的重要用途。】
结构体指针有两个重要用途,一个是结构体数据的传输存储和还原,另一个是作为结构体数据在涉及函
数时的参数入口。
什么是“结构体数据的传输存储和还原”?结构体本质是一个数组,数组内可能包含了许多不同数据长
度类型的成员,当整个结构体数据需要存储或者传输(通信)给另外一个单片机时,这时候有两种选择,一
种是一个成员一个成员的挨个处理,这种“以成员为单位”的处理方式比较繁琐麻烦,另外一种是把整个结
构体变量当作一个“以字节为单位”的普通数组来处理,但是关键的问题来了,假如我们把整个结构体数据
以“字节为单位”的方式“整体打包”传递给另外一个单片机,当这个接收方的单片机接收到我们这一组数
据后,如何把这“一包”以字节为单位的数组“还原”成相同的结构体变量,以便在程序处理中也能直接按
“结构体的方式”处理某个具体的成员,这时就涉及到结构体指针的应用。
什么是“作为结构体数据在涉及函数时的参数入口”?结构体数据一般内部包含了很多成员,当要把这
一包数据传递给某个函数内部时,这个函数要给结构体数据预留参数入口,这时,如果函数以结构体成员的
角度来预留入口,那么有多少个成员就要预留多少个函数的参数入口,可阅读性非常差,操作起来也麻烦。
但是,如果以指针的角度来预留入口,那么不管这个结构体内部包含多少个成员,只需要预留一个指针参数
入口就够用了,这就是绝大多 32 位单片机的库函数都采样结构体指针作为函数的参数入口的原因。
结构体指针这两个重要用途后续章节会深入讲解,本节的重点是先让大家学会结构体指针的基础知识,
为后续章节做准备。
【72.2 结构体指针的基础。】
操作结构体内部某个具体变量时,有两种方式,一种是成员调用的方式,另一种是指针调用的方式。C
语言语法为了区分这两种方式,专门设计了两种不同的操作符号。成员调用方式采样小数点“.”的符号,
指针调用方式采用箭头“->”的符号。例子如下:
struct StructMould_1
{
unsigned char u8Data_A;
unsigned long u32Data_B;
};
struct StructMould_1 GtMould_1; //“生成”一个变量。 //占用 5 个字节。
struct StructMould_1 *ptMould_1; //定义一个结构体指针。 //占用 3 个字节。
void main() //主函数
{
GtMould_1.u8Data_A=5; //“成员调用”的方式,用小数点符号“.”
ptMould_1=&GtMould_1; //ptMould_1 指针与变量 GtMould_1 建立关联。
ptMould_1->u8Data_A=ptMould_1->u8Data_A+5; //“指针调用”的方式,用箭头符号“->”