多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
【77.1 指针的“单向”输出通道。】 函数的接口有两个地方,一个是函数名“后面”的小括号所包含的接口参数,另一个是函数名“前面”通过函数内部return返回出来的“return返回类型”。比如: return返回类型 函数名(接口参数,接口参数...) unsigned char HanShu(unsigned char a,unsigned char b) //a和b是函数名“后面”的接口参数 { unsigned char c; c=a+b; return c; //函数内部返回出来的“return返回类型” } 指针在“函数名后面小括号所包含的接口参数”的地方时,可以是一个“双向”口(输入和输出),如果在指针前面加上const关键字修饰,可以把“双向”改为只能输入的“单向”口,注意,这里所说的“单向”是指“输入的单向”,但是做不到“输出的单向”,指针如果想做到“输出的单向”,就必须通过return这个通道。return返回指针这个功能很常用,比如用32位单片机想做比较漂亮的显示界面时,大家往往喜欢用到emWIN这个界面显示系统,而emWIN提供了很多库函数,这些库函数用了很多return返回的“句柄”,“句柄”其实就是指针,比如类似以下这行代码: hItem = WM\_GetDialogItem(hWin\_FrameWin\_GetClientWindow, ID\_LISTVIEW\_0); //获取某个控件的句柄 其中hItem就是“句柄”,本质就是函数内部return返回出来的指针。 所以本节内容主要是想告诉大家,return不仅可以返回普通的变量,也是可以返回指针的,而且还很常用。具体内容请看下面77.2例子中的讲解。 【77.2 例程练习和分析。】 编写一个函数,要从一个二维表格的数组中提取其中某一行的数据,用return这个返回输出的通道来接收该行数据的地址(指针),然后再通过这个指针的间接调用,把该行数据全部显示出来。 /\*---C语言学习区域的开始。-----------------------------------------------\*/ unsigned char \*GetRowData(unsigned char (\*pu8Table)\[3\],unsigned char u8RowSec); //函数声明 unsigned char table\[\]\[3\]= //二维数组 { {0x00,0x01,0x02}, //二维数组的第0行数据 {0x10,0x11,0x12}, //二维数组的第1行数据 {0x20,0x21,0x22}, //二维数组的第2行数据 }; //函数名前面是unsigned char \*,代表内部return返回的是unsigned char \*的指针。 unsigned char \*GetRowData(unsigned char (\*pu8Table)\[3\],unsigned char u8RowSec) { unsigned char \*pu8Row; pu8Row=(unsigned char \*)&pu8Table\[u8RowSec\]\[0\]; //提取某一行开始的地址(指针) return pu8Row; //经过return通道对外输出指针,pu8Row是一个指针类型的变量。 } unsigned char \*pGu8Row; //接收return输出的指针 unsigned char Gu8Buffer\[3\]; //一维数组,存放从二维数组里提取出来的某一行数据 unsigned char i; // for循环的变量 void main() //主函数 { pGu8Row=GetRowData(table,0);//这里的0是表示选择二维表格的第0行数据 for(i=0;i<3;i++) { Gu8Buffer\[i\]=pGu8Row\[i\]; //通过指针pGu8Row来搬运数据到一维数组Gu8Buffer } View(Gu8Buffer\[0\]); //在电脑端观察存放二维数组某行数据的一维数组的内容 View(Gu8Buffer\[1\]); //在电脑端观察存放二维数组某行数据的一维数组的内容 View(Gu8Buffer\[2\]); //在电脑端观察存放二维数组某行数据的一维数组的内容 while(1) { } } /\*---C语言学习区域的结束。-----------------------------------------------\*/ 在电脑串口助手软件上观察到的程序执行现象如下: 开始... 第1个数 十进制:0 十六进制:0 二进制:0 第2个数 十进制:1 十六进制:1 二进制:1 第3个数 十进制:2 十六进制:2 二进制:10 分析: Gu8Buffer\[0\]是0,提取了二维数组的第0行第0个数据。 Gu8Buffer\[1\]是1,提取了二维数组的第0行第1个数据。 Gu8Buffer\[2\]是2,提取了二维数组的第0行第2个数据。 【77.3 如何在单片机上练习本章节C语言程序?】 直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C语言学习区域”的代码就可以了,其它部分的代码不要动。编译后,把程序下载进带串口的51学习板,通过电脑端的串口助手软件就可以观察到不同的变量数值,详细方法请看第十一节内容。