从单片机基础到程序框架(全集 2019pdf版) - 第285页
*pu8Shan g=BeiChuShu /ChuShu; //求商 。假设除数 不会为 0 的情况。 *pu8Yu=B eiChuShu%Ch uShu; //求余 数。假设除数 不会为 0 的情况 。 } void main( ) //主函数 { ChuFa(5, 3,&DiaoYong Zhe_Shang, &DiaoYongZh e_Yu);//函数 调用。 通过 两个指针的输 出接口, 一气 呵成。 View(…

ChuFa(); //调用一次除法运算的函数
DiaoYongZhe_Shang=Shang; //把除法运算的“商”赋值给调用者的商。
DiaoYongZhe_Yu=Yu; //把除法运算的“余数”赋值给调用者的余数。
}
第二类:return。
return 只能输出一个结果,力不从心,所以这里不列举 return 的例子。
第三类:指针。
unsigned char DiaoYongZhe_Shang; //调用者的商
unsigned char DiaoYongZhe_Yu; //调用者的余数
void ChuFa(unsigned char BeiChuShu,
unsigned char ChuShu,
unsigned char *pu8Shang,
unsigned char *pu8Yu)
{
*pu8Shang=BeiChuShu/ChuShu; //求商。假设除数不会为 0 的情况。
*pu8Yu=BeiChuShu%ChuShu; //求余数。假设除数不会为 0 的情况。
}
void main()
{
ChuFa(5,3,&DiaoYongZhe_Shang,&DiaoYongZhe_Yu);//通过两个指针的输出接口,一气呵成。
}
【64.4 例程练习和分析。】
现在编一个练习程序。
/*---C 语言学习区域的开始。-----------------------------------------------*/
void ChuFa(unsigned char BeiChuShu,
unsigned char ChuShu,
unsigned char *pu8Shang,
unsigned char *pu8Yu); //函数声明
unsigned char DiaoYongZhe_Shang; //调用者的商
unsigned char DiaoYongZhe_Yu; //调用者的余数
void ChuFa(unsigned char BeiChuShu,
unsigned char ChuShu,
unsigned char *pu8Shang,
unsigned char *pu8Yu) //函数定义
{

*pu8Shang=BeiChuShu/ChuShu; //求商。假设除数不会为 0 的情况。
*pu8Yu=BeiChuShu%ChuShu; //求余数。假设除数不会为 0 的情况。
}
void main() //主函数
{
ChuFa(5,3,&DiaoYongZhe_Shang,&DiaoYongZhe_Yu);//函数调用。通过两个指针的输出接口,一气呵成。
View(DiaoYongZhe_Shang); //把第 1 个数 DiaoYongZhe_Shang 发送到电脑端的串口助手软件上观察。
View(DiaoYongZhe_Yu); //把第 2 个数 DiaoYongZhe_Yu 发送到电脑端的串口助手软件上观察。
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
第 1 个数
十进制:1
十六进制:1
二进制:1
第 2 个数
十进制:2
十六进制:2
二进制:10
分析:
DiaoYongZhe_Shang 为 1。
DiaoYongZhe_Yu 为 2。
【64.5 如何在单片机上练习本章节 C 语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C 语言学习区域”的代码就可以了,
其它部分的代码不要动。编译后,把程序下载进带串口的 51 学习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。

第六十五节: 指针作为数组在函数中的入口作用。
【65.1 函数的参数入口。】
要往函数内部传递信息,主要有两类渠道。第一类是全局变量。第二类是函数的参数入口,而参数入口
可以分为“普通局部变量”和“指针”这两类。“普通局部变量”的参数入口一次只能传一个数据,如果一
个数组有几十个甚至上百个数据,此时“普通局部变量”就无能为力,这时不可能也写几十个甚至上百个入
口参数吧(这会累坏程序员),针对这种需要输入批量数据的场合,“指针”的参数入口就因此而生,完美解
决了此问题,仅用一个“指针”参数入口就能解决一个数组 N 个数据的入口问题。那么,什么是函数的参数
入口?例子如下:
//函数声明
unsigned long PingJunZhi(unsigned char a,unsigned char b,unsigned char c,unsigned char d);
//变量定义
unsigned char Gu8Buffer[4]={2,6,8,4}; //4 个变量分别是 2,6,8,4。
unsigned long Gu32PingJunZhi; //求平均值的结果
//函数定义
unsigned long PingJunZhi(unsigned char a,unsigned char b,unsigned char c,unsigned char d)
{
unsigned long u32PingJunZhi;
u32PingJunZhi=(a+b+c+d)/4;
return u32PingJunZhi;
}
void main() //主函数
{
//函数调用
Gu32PingJunZhi=PingJunZhi(Gu8Buffer[0],Gu8Buffer[1],Gu8Buffer[2],Gu8Buffer[3]);
}
上面是一个求 4 个数据平均值的函数,在这个函数中,函数小括号的(unsigned char a,unsigned char
b,unsigned char c,unsigned char d)就是 4 个变量的“普通局部变量”参数入口,刚才说到,如果一个数
组有上百个变量,这种书写方式是很累的。如果改用“指针”入口参数的方式,例子如下:
//函数声明
unsigned long PingJunZhi(unsigned char *pu8Buffer);
//变量定义
unsigned char Gu8Buffer[4]={2,6,8,4}; //4 个变量分别是 2,6,8,4。
unsigned long Gu32PingJunZhi; //求平均值的结果