从单片机基础到程序框架(全集 2019pdf版).pdf - 第329页
第七十六节: 二维数组的指针。 【76.1 二维数组指针的用途。 】 前面章节讲 了一维指针 操作二维数组 , 本质是通过 “类型 强制转 换” 实现的, 这种应用局 限于某些特 定 的场合, 毕竟一维有 1 个下 标, 二维有 2 个下 标, 一维和二维 在队形感上 是有明显 差别的, 强行用一维 指针 操作二维数 组会破坏了代 码原有的队形 感,大 多数的情况, 还是用二维指 针操作二维数 组。 二维指针主 要应用在两 个方面, 一…

{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
第 1 个数
十进制:32
十六进制:20
二进制:100000
第 2 个数
十进制:33
十六进制:21
二进制:100001
第 3 个数
十进制:34
十六进制:22
二进制:100010
分析:
Gu8Buffer[0]是十六进制的 0x20,提取了二维数组第 2 行中的某数据。
Gu8Buffer[1]是十六进制的 0x21,提取了二维数组第 2 行中的某数据。
Gu8Buffer[2]是十六进制的 0x22,提取了二维数组第 2 行中的某数据。
【75.7 如何在单片机上练习本章节 C 语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C 语言学习区域”的代码就可以了,
其它部分的代码不要动。编译后,把程序下载进带串口的 51 学习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。

第七十六节: 二维数组的指针。
【76.1 二维数组指针的用途。】
前面章节讲了一维指针操作二维数组,本质是通过“类型强制转换”实现的,这种应用局限于某些特定
的场合,毕竟一维有 1 个下标,二维有 2 个下标,一维和二维在队形感上是有明显差别的,强行用一维指针
操作二维数组会破坏了代码原有的队形感,大多数的情况,还是用二维指针操作二维数组。
二维指针主要应用在两个方面,一方面是 N 个二维数组的“中转站”应用,另一方面是函数接口的应用。
比如,当某项目有 N 个二维数组表格时,要通过某个变量来切换处理某个特定的表格,以便实现“N 选一”
的功能,此时,二维指针在这 N 个二维数组之间就起到中转站的作用。又,当某个函数接口想输入或者输出
一个二维数组时,就必然要用到二维指针作为函数的接口参数。
【76.2 二维指针的“中转站”应用。】
举一个例子,有 3 个现有的二维数组,通过某个变量来选择切换,把某个二维数组的数据复制到指定的
一个缓存数组中。
code unsigned char table_1[3][3]= //第 1 个现有的二维数组
{
{0x00,0x01,0x02},
{0x10,0x11,0x12},
{0x20,0x21,0x22},
};
code unsigned char table_2[3][3]= //第 2 个现有的二维数组
{
{0xA0,0xA1,0xA2},
{0xB0,0xB1,0xB2},
{0xC0,0xC1,0xC2},
};
code unsigned char table_3[3][3]= //第 3 个现有的二维数组
{
{0xD0,0xD1,0xD2},
{0xE0,0xE1,0xE2},
{0xF0,0xF1,0xF2},
};
unsigned char SaveBuffer[3][3]; //指定的一个缓存数组
unsigned char TableSec; //选择变量
const unsigned char (*pTable)[3]; //“中转站”的二维指针
unsigned char R,L; //复制数据时用到的 for 循环变量
void main()

{
TableSec=2; //选择第 2 个现有的二维数组
switch(TableSec) //根据选择变量来切换选择某个现有的二维数组
{
case 1: //选择第 1 个现有二维数组
pTable=table_1; //二维指针 pTable 在这里关联指定的数组,起到中转站的作用。
break;
case 2: //选择第 2 个现有二维数组
pTable=table_2; //二维指针 pTable 在这里关联指定的数组,起到中转站的作用。
break;
case 3: //选择第 3 个现有二维数组
pTable=table_2; //二维指针 pTable 在这里关联指定的数组,起到中转站的作用。
break;
}
//通过二维指针 pTable 来复制数据到指定的缓存数组 SaveBuffer
for(R=0;R<3;R++) //行循环
{
for(L=0;L<3;L++) //列循环
{
SaveBuffer[R][L]=pTable[R][L]; //这里能看到,二维指针维护了二维数组的队形感
}
}
while(1)
{
}
}
【76.3 二维指针在“函数接口”中的应用。】
把上述例子“复制过程”的代码封装成一个函数,实现的功能还是一样,有 3 个现有的二维数组,通过
某个变量来选择切换,把某个二维数组的数据复制到指定的一个缓存数组中。
//函数声明
void CopyBuffer(const unsigned char (*pTable)[3],unsigned char (*pSaveBuffer)[3]);
code unsigned char table_1[3][3]= //第 1 个现有的二维数组
{
{0x00,0x01,0x02},
{0x10,0x11,0x12},
{0x20,0x21,0x22},