从单片机基础到程序框架(全集 2019pdf版).pdf - 第330页
{ TableSec =2; //选择 第 2 个现有的二 维数组 switch(T ableSec) //根据 选择变量来切 换选择某个现 有的二维数组 { case 1: //选择 第 1 个现有二维 数组 pTable=t able_1; //二维 指针 pTabl e 在这里关联指定的 数组, 起到中转站的 作用。 break; case 2: //选择 第 2 个现有二维数 组 pTable=t able_2; //二维 指针…

第七十六节: 二维数组的指针。
【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},

};
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; //选择变量
//*pTable 是输入接口带 const 修饰,*pSaveBuffer 是输出结果的接口无 const。
void CopyBuffer(const unsigned char (*pTable)[3],unsigned char (*pSaveBuffer)[3])
{
unsigned char R,L; //复制数据时用到的 for 循环变量
for(R=0;R<3;R++) //行循环
{
for(L=0;L<3;L++) //列循环
{
pSaveBuffer[R][L]=pTable[R][L]; //这里能看到,二维指针维护了二维数组的队形感
}
}
}
void main()
{
TableSec=2; //选择第 2 个现有的二维数组
switch(TableSec) //根据选择变量来切换选择某个现有的二维数组
{
case 1: //选择第 1 个现有二维数组
CopyBuffer(table_1,SaveBuffer); //二维指针在这里分别体现了输入和输出接口作用
break;
case 2: //选择第 2 个现有二维数组
CopyBuffer(table_2,SaveBuffer); //二维指针在这里分别体现了输入和输出接口作用