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

break; case 3: / /选择第 3 个现 有二维数组 CopyBuff er(table_3, SaveBuffer ); //二维 指针在这里分 别体现了输入 和输出接口作 用 break; } while(1) { } } 【76.4 二维指针“类型强制转换”的书写格式。 】 unsigned cha r *p u8,unsign ed i nt *pu16,unsig ned int *pu32 这些指针的 书写定义 …

100%1 / 836
};
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},
{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); //二维指针在这里分别体现了输入和输出接口作