合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
【64.1 函数的三类输出渠道。】 函数是模块,模块必须具备输入和输出的接口,从输入和输出的角度分析,函数对外部调用者传递信息主要有三类渠道,第一类是全局变量,第二类是return返回值,第三类是用指针。全局变量太隐蔽,没有那么直观,可读性稍差。return可读性强,缺点是一个函数的return只能算一个数据的“出口”,如果一个函数要输出多个结果,return就力不从心。指针作为函数的输出接口,就能随心所欲了,不但可读性强,而且输出的接口数量不受限制。 【64.2 只有一个输出接口的时候。】 现在举一个例子,要用函数实现一个加法运算,输出“一个”加法运算的和,求3加上5等于8。下面三个例子中分别使用“全局变量,return,指针”这三类输出接口。 第一类:全局变量。 unsigned char DiaoYongZhe; //调用者 unsigned char BeiJiaShu; //被加数 unsigned char JiaShu; //加数 unsigned char He; //输出的接口,加法运算的"和"。 void JiaFa(void) { He=BeiJiaShu+JiaShu; } void main() { BeiJiaShu=3; //填入被加数3 JiaShu=5; //填入加数5 JiaFa(); //调用一次加法运算的函数 DiaoYongZhe=He; //把加法运算的“和”赋值给调用者。 } 第二类:return。 unsigned char DiaoYongZhe; //调用者 unsigned char JiaFa(unsigned char BeiJiaShu,unsigned char JiaShu) { unsigned char He; He=BeiJiaShu+JiaShu; return He; } void main() { DiaoYongZhe=JiaFa(3,5); //把加法运算的“和”赋值给调用者,一气呵成。 } 第三类:指针。 unsigned char DiaoYongZhe; //调用者 void char JiaFa(unsigned char BeiJiaShu,unsigned char JiaShu,unsigned char \*pu8He) { \*pu8He=BeiJiaShu+JiaShu; } void main() { JiaFa(3,5,&DiaoYongZhe); //通过指针这个输出渠道,把加法运算的“和”赋值给调用者,一气呵成。 } 【64.3 有多个输出接口的时候。】 现在举一个例子,要用函数实现一个除法运算,分别输出除法运算的商和余数这“两个”数,求5除以3等于1余2。因为return只能输出一个结果,所以这里不列举return的例子,只使用“全局变量”和“指针”这两类输出接口。 第一类:全局变量。 unsigned char DiaoYongZhe\_Shang; //调用者的商 unsigned char DiaoYongZhe\_Yu; //调用者的余数 unsigned char BeiChuShu; //被除数 unsigned char ChuShu; //除数 unsigned char Shang; //输出的接口,除法运算的"商"。 unsigned char Yu; //输出的接口,除法运算的"余"。 void ChuFa(void) { Shang=BeiChuShu/ChuShu; //求商。假设除数不会为0的情况。 Yu=BeiChuShu%ChuShu; //求余数。假设除数不会为0的情况。 } void main() { BeiChuShu=5; //填入被除数5 ChuShu=3; //填入除数3 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学习板,通过电脑端的串口助手软件就可以观察到不同的变量数值,详细方法请看第十一节内容。