从单片机基础到程序框架(全集 2019pdf版).pdf - 第331页

}; code u nsigned char table _2[3][3]= //第 2 个现 有的二维数 组 { {0xA0,0x A1,0xA2}, {0xB0,0x B1,0xB2}, {0xC0,0x C1,0xC2}, }; code u nsigned char table _3[3][3]= //第 3 个现 有的二维数 组 { {0xD0,0x D1,0xD2}, {0xE0,0x E1,0xE2}, {0xF0,0x …

100%1 / 836
{
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); //二维指针在这里分别体现了输入和输出接口作
break;
case 3: //选择第 3 个现有二维数组
CopyBuffer(table_3,SaveBuffer); //二维指针在这里分别体现了输入和输出接口作
break;
}
while(1)
{
}
}
【76.4 二维指针“类型强制转换”的书写格式。
unsigned char *pu8,unsigned int *pu16,unsigned int *pu32 这些指针的书写定义都是很有规则感的,
相比之下,二维指针的定义显得缺乏规则感,比如定义的二维指针变量 unsigned char (*pTable)[3],不
则在哪?就在于二维指针的变量 pTable 嵌入到了括号中去,跟符号“*”捆绑在一起这时就会冒出一个
题,如果我要强制某个指针变量为二维指针怎么办?下面的例子已经给出了答案。
unsigned char table[3][3]= //二维数组
{
{0xD0,0xD1,0xD2},
{0xE0,0xE1,0xE2},
{0xF0,0xF1,0xF2},
};
unsigned char (*pTable)[3];
void main()
{
pTable=(unsigned char (*)[3])table; //这里,强制类型转换用 unsigned char (*)[3]
}
总结:二维数组的强制类型转换用这种书写格式(unsigned char (*)[N]),这里 N 代表实际项目
中某数组的“列”数。
【76.5 例程练习和分析。
现在编写一个练习程序。
/*---C 语言学习区域的开始。-----------------------------------------------*/
void CopyBuffer(const unsigned char (*pTable)[3],unsigned char (*pSaveBuffer)[3]);
code unsigned char table_1[3][3]= //第 1 个现有的二维数
{
{0x00,0x01,0x02},