从单片机基础到程序框架(全集 2019pdf版).pdf - 第276页
十进制:18 十六进制:1 2 二进制:100 10 第 2 个数 十进制:52 十六进制:3 4 二进制:110 100 第 3 个数 十进制:86 十六进制:5 6 二进制:101 0110 第 4 个数 十进制:120 十六进制:7 8 二进制:111 1000 第 5 个数 十进制:305 419896 十六进制:1 2345678 二进制:100 100011010 001010110011 11000 分析: Gu8Buff…

小端”的问题。“化整为零”和“化零为整”这两个“互逆”过程要么同时为“大端”,要么同时为“小端”,
否则会因字节的排列顺序问题而引起数据的严重错误。
【62.5 例程练习和分析。】
现在编一个练习程序。
/*---C 语言学习区域的开始。-----------------------------------------------*/
unsigned long a=0x12345678;
unsigned char Gu8BufferA[4];
unsigned char Gu8BufferB[4]={0x12,0x34,0x56,0x78};
unsigned long b;
unsigned long *pu32; //引入一个指针变量,注意,这里是 unsigned long 类型的指针。
void main() //主函数
{
pu32=(unsigned long *)&Gu8BufferA[0]; //指针跟数组“绑定”(也称为“关联”)起来。
*pu32=a; //化整为零
pu32=(unsigned long *)&Gu8BufferB[0]; //指针跟数组“绑定”(也称为“关联”)起来。
b=*pu32; //化零为整
View(Gu8BufferA[0]); //把第 1 个数 Gu8BufferA[0]发送到电脑端的串口助手软件上观察。
View(Gu8BufferA[1]); //把第 2 个数 Gu8BufferA[1]发送到电脑端的串口助手软件上观察。
View(Gu8BufferA[2]); //把第 3 个数 Gu8BufferA[2]发送到电脑端的串口助手软件上观察。
View(Gu8BufferA[3]); //把第 4 个数 Gu8BufferA[3]发送到电脑端的串口助手软件上观察。
View(b); //把第 5 个数 b 发送到电脑端的串口助手软件上观察。
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
第 1 个数

十进制:18
十六进制:12
二进制:10010
第 2 个数
十进制:52
十六进制:34
二进制:110100
第 3 个数
十进制:86
十六进制:56
二进制:1010110
第 4 个数
十进制:120
十六进制:78
二进制:1111000
第 5 个数
十进制:305419896
十六进制:12345678
二进制:10010001101000101011001111000
分析:
Gu8BufferA[0]为 0x12。
Gu8BufferA[1]为 0x34。
Gu8BufferA[2]为 0x56。
Gu8BufferA[3]为 0x78。
b 为 0x12345678。
【62.6 如何在单片机上练习本章节 C 语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C 语言学习区域”的代码就可以了,
其它部分的代码不要动。编译后,把程序下载进带串口的 51 学习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。

第六十三节: 指针“化整为零”和“化零为整”的“灵活”应用。
【63.1 化整为零的“灵活”应用。】
上一节讲“化整为零”的例子,指针是跟数组的首地址(下标是 0)“绑定”的,这样,很多初学者就误
以为指针跟数组“绑定”时,只能跟数组的“首地址”关联。其实,指针是可以跟数组的任何一个成员的地
址“绑定”(只要不超过数组的长度导致越界),它不仅仅局限于首地址,指针的这个特征就是本节标题所说
的“灵活”。请看下面这个例子:
有 3 个变量,分别是单字节 unsigned char a,双字节 unsigned int b,四字节 unsigned long c,它
们加起来一共有 7 个字节,要把这 7 个字节放到一个 7 字节容量的数组里。除了用传统的“移位法”,还有
一种更加便捷的“指针法”,代码如下:
unsigned char a=0x01;
unsigned int b=0x0203;
unsigned long c=0x04050607;
unsigned char Gu8BufferABC[7]; //存放 3 个不同长度变量的数组
unsigned char *pu8; //引入的 unsigned char 类型指针
unsigned int *pu16; //引入的 unsigned int 类型指针
unsigned long *pu32; //引入的 unsigned long 类型指针
pu8=&Gu8BufferABC[0]; //指针跟数组的第 0 个位置“绑定”起来。
*pu8=a; //把 a 的 1 个字节放在数组第 0 个位置。
pu16=(unsigned int *)&Gu8BufferABC[1]; //指针跟数组的第 1 个位置“绑定”起来。
*pu16=b; //把 b 的 2 个字节放在数组第 1、2 这两个位置。
pu32=(unsigned long *)&Gu8BufferABC[3]; //指针跟数组的第 3 个位置“绑定”起来。
*pu32=c; //把 c 的 4 个字节放在数组第 3、4、5、6 这四个位置。
【63.2 化零为整的“灵活”应用。】
刚才讲的是“化整为零”,现在讲的是“化零为整”。刚才讲的是“分解”,现在讲的是“合成”。请看下
面这个例子:
有一个容量为 7 字节数组,第 0 字节存放的是 unsigned char d 变量,第 1、2 字节存放的是 unsigned int
e 变量,第 3、4、5、6 字节存放的是 unsigned long f 变量,现在要从数组中“零散”的字节里提取并且合
成为“完整”的 3 个变量。代码如下:
unsigned char Gu8BufferDEF[7]={0x01,0x02,0x03,0x04,0x05,0x06,0x07}; //注意大小端的问题
unsigned char d;