从单片机基础到程序框架(全集 2019pdf版).pdf - 第291页
十进制:7 十六进制:7 二进制:111 第 3 个数 十进制:8 十六进制:8 二进制:100 0 第 4 个数 十进制:9 十六进制:9 二进制:100 1 分析: Gu8Buffe r[0]为 6。 Gu8Buffe r[1]为 7。 Gu8Buffe r[2]为 8。 Gu8Buffe r[3]为 9。 【66.3 如何在单片机上练习本章节 C 语言程序?】 直接复制前 面章节中第十 一节的模板程 序, 练习代码时只需要 更改 …

/*---C 语言学习区域的开始。-----------------------------------------------*/
//函数声明
void TiQu(unsigned int u16Data,unsigned char *pu8Buffer);
//全局变量定义
unsigned char Gu8Buffer[4]; //存放提取结果的数组
//函数定义
void TiQu(unsigned int u16Data,unsigned char *pu8Buffer) //“提取”函数
{
pu8Buffer[0]=u16Data/1%10; //提取个位
pu8Buffer[1]=u16Data/10%10; //提取十位
pu8Buffer[2]=u16Data/100%10; //提取百位
pu8Buffer[3]=u16Data/1000%10; //提取千位
}
void main() //主函数
{
TiQu(9876,&Gu8Buffer[0]); //把 9876 这个四位数分别提取 6、7、8、9 存放在数组 Gu8Buffer 里
View(Gu8Buffer[0]); //把第 1 个数 Gu8Buffer[0])发送到电脑端的串口助手软件上观察
View(Gu8Buffer[1]); //把第 2 个数 Gu8Buffer[1])发送到电脑端的串口助手软件上观察
View(Gu8Buffer[2]); //把第 3 个数 Gu8Buffer[2])发送到电脑端的串口助手软件上观察
View(Gu8Buffer[3]); //把第 4 个数 Gu8Buffer[3])发送到电脑端的串口助手软件上观察
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
第 1 个数
十进制:6
十六进制:6
二进制:110
第 2 个数

十进制:7
十六进制:7
二进制:111
第 3 个数
十进制:8
十六进制:8
二进制:1000
第 4 个数
十进制:9
十六进制:9
二进制:1001
分析:
Gu8Buffer[0]为 6。
Gu8Buffer[1]为 7。
Gu8Buffer[2]为 8。
Gu8Buffer[3]为 9。
【66.3 如何在单片机上练习本章节 C 语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C 语言学习区域”的代码就可以了,
其它部分的代码不要动。编译后,把程序下载进带串口的 51 学习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。

第六十七节: 指针作为数组在函数中既“入口”又“出口”的作用。
【67.1 指针作为数组在函数中的“入口”和“出口”。】
前面分别讲了指针的入口和出口,很多初学者误以为指针是一个“单向”的通道,其实,如果指针前面
没有加 const 这个“紧箍咒”限定它的属性,指针是“双向”的,不是“单向”的,也就是说,指针是可以
同时具备“入口”和“出口”这两种属性的。现在讲一个程序例子,求一个数组(内含 4 元素)的每个元素
变量的整数倍的一半,所谓整数倍的一半,就是除以 2,但是不带小数点,比如 4 的整数倍的一半是 2,7
的整数倍的一半是 3(不是 3.5),代码如下:
void Half(unsigned char *pu8Buffer) //“求一半”的函数
{
unsigned char u8Data_0; //临时中间变量
unsigned char u8Data_1; //临时中间变量
unsigned char u8Data_2; //临时中间变量
unsigned char u8Data_3; //临时中间变量
//从指针这个“入口”里获取需要“被除以 2”的数据。
u8Data_0=pu8Buffer[0];
u8Data_1=pu8Buffer[1];
u8Data_2=pu8Buffer[2];
u8Data_3=pu8Buffer[3];
//求数据的整数倍的一半的算法
u8Data_0=u8Data_0/2;
u8Data_1=u8Data_1/2;
u8Data_2=u8Data_2/2;
u8Data_3=u8Data_3/2;
//最后,把计算所得的结果分别传输到指针这个“出口”
pu8Buffer[0]=u8Data_0;
pu8Buffer[1]=u8Data_1;
pu8Buffer[2]=u8Data_2;
pu8Buffer[3]=u8Data_3;
}
上述代码,为了突出“入口”和“出口”,我刻意多增加了 u8Data_0,u8Data_1,u8Data_2,u8Data_3
这 4 个临时中间变量,其实,这 4 个临时中间变量还可以省略的,此函数简化后的等效代码如下:
void Half(unsigned char *pu8Buffer) //“求一半”的函数
{
pu8Buffer[0]=pu8Buffer[0]/2;
pu8Buffer[1]=pu8Buffer[1]/2;