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

{ } } /*---C 语言学习区 域的结束。 ----- ----------- ---------- ----------- ---------- */ 在电脑串口 助手软件上观 察到的程序执 行现象 如下: 开始... 第 1 个数 十进制:32 十六进制:2 0 二进制:100 000 第 2 个数 十进制:33 十六进制:2 1 二进制:100 001 第 3 个数 十进制:34 十六进制:2 2 二进制:100 010 分…

100%1 / 836
}
【75.5 注意指针或者数组越界的问题。
上述例子中二维数组内部只有 9 个数据,如果指针操作的数据超过了这 9 个数据的地址范围就会导
致系统其它无辜的数据受到破坏,这个问题导致的后果是很严重的,这类指针或者数组越界的问题家平
时做项目时必须留心注意
【75.6 例程练习和分析。
现在编写一个练习程序。
/*---C 语言学习区域的开始。-----------------------------------------------*/
void GetRowData(unsigned char *pu8); //函数的声明
unsigned char table[][3]= //二维数组
{
{0x00,0x01,0x02}, //二维数组的第 0 行数据
{0x10,0x11,0x12}, //二维数组的第 1 行数据
{0x20,0x21,0x22}, //二维数组的第 2 行数据
};
unsigned char Gu8Buffer[3]; //一维数组,存放从二维数组里提取出来的某一行数据
void GetRowData(unsigned char *pu8) //一维指针的函数接
{
unsigned char i; // for 循环的变量
for(i=0;i<3;i++)
{
Gu8Buffer[i]=pu8[i]; //提取二维数组的某行数据,存入到一个一维数组里。
}
}
void main() //主函
{
GetRowData((unsigned char *)&table[2][0]); //利用类型强制转换来兼容一维指针的函数接口
View(Gu8Buffer[0]); //在电脑端观察存放二维数组某行数据的一维数组的内
View(Gu8Buffer[1]); //在电脑端观察存放二维数组某行数据的一维数组的内
View(Gu8Buffer[2]); //在电脑端观察存放二维数组某行数据的一维数组的内
while(1)
{
}
}
/*---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()