金牌会员
 
- 积分
- 1181
- 金钱
- 1181
- 注册时间
- 2018-4-13
- 在线时间
- 170 小时
|

楼主 |
发表于 2018-9-18 17:32:48
|
显示全部楼层
本帖最后由 xiatianyun 于 2018-9-18 19:16 编辑
继续学习,这次是用串口助手来调试程序的usmart试验,使用到了一些C语言的指针高级用法。以前没有学过这方面的内容,这次补习。
C语言中的数组名可以被当作数组地址来使用,这在数组上的一些操作中使用很普遍。
C语言中的字符串没有专门的类型,这导致了C语言对字符串的操作有一些其他语言没有的坑。
字符串常量是储存在字符数组中的,不过字符数组的末了使用空字符结尾,这样储存的字符数组长度比字符串本身长度多1.
而数组名可以被作为数组地址使用,所以字符串常量是被作为字符指针表示的(其实是不可修改的数组地址)。
e.g:
void func1(char * s);
调用:func1("foooooo");
-------------------------------------------------
指向函数的指针和数组名类似,其实C语言中指向函数的指针是被当作指向数据的指针来对待的。
声明指向函数的指针需要声明参数类型和返回值类型,至于名字则无所谓,满足普通变量命名规则即可。这样这个指针就可指向任何满足该参数类型和返回值类型的函数了。
e.g:
double func1(int a, double b);
double (*pf)(int a, double b);
事实上,形参名可以不用,这样可以:double (*pf)(int, double);
(*pf)的语法是关键,这样才能说明pf是个指向函数的指针,而不是返回double *的函数。
如何调用呢?
首先使pf指向需要的函数:
pf = func1;
这里类似与数组名的使用,不用取址符号&.
调用:(*pf)(34, 34.34);
也可以是: pf(34, 34.34);推荐使用前一种,能够让我们知道pf是个函数指针。
------------------------------------------------
指向函数的指针让我想起来多年前学习过的虚构类的虚构方法来了,有点像哦。
既然指向函数的指针是作为指向数据的指针来对待的,那么就可以被用来作为数组的元素和结构成员来存储了。
比如,设计一个数组,数组元素是指向同一类型声明的函数指针,初始化一般和声明一起编写:
int (*pf[])(int, double) = { func1, func2, func3};
同样,func1、func2、func3表示函数地址。
指向函数的指针在msmart试验中用在结构成员中。
|
|