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

{0x10,0x 11,0x12}, {0x20,0x 21,0x22}, }; 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 …

100%1 / 836
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},
{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;
}
View(SaveBuffer[0][0]); //在电脑端观察某个二维数组第 0 行数据第 0 个元素的内
View(SaveBuffer[0][1]); //在电脑端观察某个二维数组第 0 行数据第 1 个元素的内
View(SaveBuffer[0][2]); //在电脑端观察某个二维数组第 0 行数据第 2 个元素的内
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
1 个数
十进制:160
十六进制:A0
二进制:10100000
2 个数
十进制:161
十六进制:A1
二进制:10100001
3 个数
十进制:162
十六进制:A2
二进制:10100010
分析:
SaveBuffer[0][0]是十六进制的 0xA0,提取了第 2 个二维数组的第 0 0 个数据。
SaveBuffer[0][1]是十六进制的 0xA1,提取了第 2 个二维数组的第 0 1 个数据。
SaveBuffer[0][2]是十六进制的 0xA2,提取了第 2 个二维数组的第 0 2 个数据。
【76.6 如何在单片机上练习本章节 C 语言程序?】