从单片机基础到程序框架(全集 2019pdf版).pdf - 第318页
直接复制前 面章节中第十 一节的模板程 序, 练习代码时只需要 更改 “ C 语言学习区 域” 的 代码就可 以了, 其它 部分的 代码 不要动 。编 译后 ,把程 序下 载进带 串口 的 51 学 习板, 通过 电脑 端的串 口助 手软件 就可 以观 察到不同的 变量数值,详 细方法请看第 十一节 内容。

Gu8Buffer[i]=pu8[i]; //把结构体变量以字节的方式搬运并且存储到普通数组里。
}
ptStruct=(struct StructMould_1 *)&Gu8Buffer[0]; //再把普通数组强制“还原”成结构体指针
ptStruct->u8Data_A=ptStruct->u8Data_A+1; //该变量从 5 自加 1 后变成 6。
ptStruct->u32Data_B=ptStruct->u32Data_B+1; //该变量从 6 自加 1 后变成 7。
ptStruct->u16Data_C=ptStruct->u16Data_C+1; //该变量从 7 自加 1 后变成 8。
View(ptStruct->u8Data_A); //在电脑端观察结构体成员 u8Data_A 的数值。
View(ptStruct->u32Data_B); //在电脑端观察结构体成员 u32Data_B 的数值。
View(ptStruct->u16Data_C); //在电脑端观察结构体成员 u16Data_C 的数值。
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
第 1 个数
十进制:6
十六进制:6
二进制:110
第 2 个数
十进制:7
十六进制:7
二进制:111
第 3 个数
十进制:8
十六进制:8
二进制:1000
分析:
结构体成员 u8Data_A 的数值是 6。
结构体成员 u32Data_B 的数值是 7。
结构体成员 u16Data_C 的数值是 8。
【73.3 如何在单片机上练习本章节 C 语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C 语言学习区域”的代码就可以了,
其它部分的代码不要动。编译后,把程序下载进带串口的 51 学习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。

第七十四节: 结构体指针在函数接口处的频繁应用。
【74.1 重温“函数的接口参数”。】
函数的接口参数主要起到标识的作用。比如:
一个加法函数:
unsigned char add(unsinged char a,unsigned char b)
{
return (a+b);
}
这里的 a 和 b 就是接口参数,它的作用是告诉人们,你把两个加数分别代入 a 和 b,返回的就是你要的
加法运算结果。这里的接口参数就起到入口标识的作用。注意,这句话的关键词是“标识”而不是“入口”,
因为函数的“入口”不是唯一的,而是无数条路径。为什么这么说?我们把上面的例子改一下,改成全局变
量,例子如下:
一个加法函数:
unsinged char a; //加数
unsigned char b; //加数
unsigned char c; //和
void add(void)
{
c=a+b;
}
上述例子中,尽管我用“两个”void(空的)关键词把原来加法函数的入口(接口参数)和出口(return
返回)都堵得死死的,但是,全局变量是无法阻挡的,它进入一个函数的内部不受任何限制,也就是说,我
们做项目的时候,如果把所有函数的接口参数和返回都改成 void 类型,所有的信息传递都改用全局变量,
这样也是可以勉强把项目做完成的。但是,如果真的把所有函数的接口参数都改成 void,全部靠全局变量来
传递信息,那么最大的问题是函数多了之后,阅读非常不方面,你每看到一个被调用的函数,你不能马上猜
出它大概跟哪些全局变量发生了关联,你必须一个一个的去查该函数的源代码才能理清楚,针对这个问题,
C 语言的设计者,给了函数非常丰富的接口参数,最理想的函数是:你把凡是与此函数相关的全局变量都经
过接口参数的入口才进入到函数内部,尽量把接口参数的入口看作是函数的唯一合法入口(尽管不是唯一也
不是必须),这样只要看函数的接口参数就知道这个函数跟哪些全局变量有关,函数的输入输出就非常清晰
明了。但是问题又来了,如果有多少个全局变量就开多少个接口参数,接口参数就会变得非常多,接口参数
多了,函数的门面就非常难看,无异于把本来应该“小而窄”的接口设在“宽而广”的平原上,还不如直接
用原来那种全局变量强行进入呢。那么,要解决这个问题怎么办?本节的主角“结构体指针”可以解决这个
问题。
【74.2 结构体指针在函数接口处的频繁应用。】
当函数的接口参数非常多的时候,可以把 N 个相关的全局变量“打包”成一个结构体数据,碰到函数接
口的时候,可以通过“结构体指针”以“包”为单位的方式进入,这样就可以让函数的接口参数看起来非常
少,这种方法,是很多 32 位单片机的库函数一直在用的方法,它最重要的好处是简化入口的通道数量。你
想想,32 位单片机有那么多寄存器,如果没有这种以“结构体指针”为接口参数的方式,它的入口可能需要