ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
【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; unsigned int e; unsigned long f; unsigned char \*pu8; //引入的unsigned char 类型指针 unsigned int \*pu16; //引入的unsigned int 类型指针 unsigned long \*pu32; //引入的unsigned long 类型指针 pu8=&Gu8BufferDEF\[0\]; //指针跟数组的第0个位置“绑定”起来。 d=\*pu8; //从数组第0位置提取单字节完整的d变量。 pu16=(unsigned int \*)&Gu8BufferDEF\[1\]; //指针跟数组的第1个位置“绑定”起来。 e=\*pu16; //从数组第1,2位置提取双字节完整的e变量。 pu32=(unsigned long \*)&Gu8BufferDEF\[3\]; //指针跟数组的第3个位置“绑定”起来。 f=\*pu32; //从数组第3,4,5,6位置提取四字节完整的f变量。 【63.3 例程练习和分析。】 现在编一个练习程序。 /\*---C语言学习区域的开始。-----------------------------------------------\*/ unsigned char a=0x01; unsigned int b=0x0203; unsigned long c=0x04050607; unsigned char Gu8BufferABC\[7\]; //存放3个不同长度变量的数组 unsigned char Gu8BufferDEF\[7\]={0x01,0x02,0x03,0x04,0x05,0x06,0x07}; //注意大小端的问题 unsigned char d; unsigned int e; unsigned long f; unsigned char \*pu8; //引入的unsigned char 类型指针 unsigned int \*pu16; //引入的unsigned int 类型指针 unsigned long \*pu32; //引入的unsigned long 类型指针 void main() //主函数 { //第1类例子:化整为零。 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这四个位置。 //第2类例子:化零为整。 pu8=&Gu8BufferDEF\[0\]; //指针跟数组的第0个位置“绑定”起来。 d=\*pu8; //从数组第0位置提取单字节完整的d变量。 pu16=(unsigned int \*)&Gu8BufferDEF\[1\]; //指针跟数组的第1个位置“绑定”起来。 e=\*pu16; //从数组第1,2位置提取双字节完整的e变量。 pu32=(unsigned long \*)&Gu8BufferDEF\[3\]; //指针跟数组的第3个位置“绑定”起来。 f=\*pu32; //从数组第3,4,5,6位置提取四字节完整的f变量。 View(Gu8BufferABC\[0\]); //把第1个数Gu8BufferABC\[0\]发送到电脑端的串口助手软件上观察。 View(Gu8BufferABC\[1\]); //把第2个数Gu8BufferABC\[1\]发送到电脑端的串口助手软件上观察。 View(Gu8BufferABC\[2\]); //把第3个数Gu8BufferABC\[2\]发送到电脑端的串口助手软件上观察。 View(Gu8BufferABC\[3\]); //把第4个数Gu8BufferABC\[3\]发送到电脑端的串口助手软件上观察。 View(Gu8BufferABC\[4\]); //把第5个数Gu8BufferABC\[4\]发送到电脑端的串口助手软件上观察。 View(Gu8BufferABC\[5\]); //把第6个数Gu8BufferABC\[5\]发送到电脑端的串口助手软件上观察。 View(Gu8BufferABC\[6\]); //把第7个数Gu8BufferABC\[6\]发送到电脑端的串口助手软件上观察。 View(d); //把第8个数d发送到电脑端的串口助手软件上观察。 View(e); //把第9个数e发送到电脑端的串口助手软件上观察。 View(f); //把第10个数f发送到电脑端的串口助手软件上观察。 while(1) { } } /\*---C语言学习区域的结束。-----------------------------------------------\*/ 在电脑串口助手软件上观察到的程序执行现象如下: 开始... 第1个数 十进制:1 十六进制:1 二进制:1 第2个数 十进制:2 十六进制:2 二进制:10 第3个数 十进制:3 十六进制:3 二进制:11 第4个数 十进制:4 十六进制:4 二进制:100 第5个数 十进制:5 十六进制:5 二进制:101 第6个数 十进制:6 十六进制:6 二进制:110 第7个数 十进制:7 十六进制:7 二进制:111 第8个数 十进制:1 十六进制:1 二进制:1 第9个数 十进制:515 十六进制:203 二进制:1000000011 第:个数(这里是第10个数。本模块程序只支持显示第1到第9个,所以这里没有显示“10”) 十进制:67438087 十六进制:4050607 二进制:100000001010000011000000111 分析: Gu8BufferABC\[0\]为0x01。 Gu8BufferABC\[1\]为0x02。 Gu8BufferABC\[2\]为0x03。 Gu8BufferABC\[3\]为0x04。 Gu8BufferABC\[4\]为0x05。 Gu8BufferABC\[5\]为0x06。 Gu8BufferABC\[6\]为0x07。 d为0x01。 e为0x0203。 f为0x04050607。 【63.4 如何在单片机上练习本章节C语言程序?】 直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C语言学习区域”的代码就可以了,其它部分的代码不要动。编译后,把程序下载进带串口的51学习板,通过电脑端的串口助手软件就可以观察到不同的变量数值,详细方法请看第十一节内容。