先看一个简单例子:
void(*funcPtr)();
当看到这样的一个定义时,最好的处理方法是从中间开始和向外扩展以及挖空括号。“从中间开始”的意思是从变量名开始,
“向外扩展”的意思是先注意右边最近的项,遇括号变向,如此持续下去。“挖空括号”是指把变量名所在的括号去掉并去掉参数
表所在括号,就得到其函数的返回值(仅限于函数声明)。以上分析如下:
中间开始----> funcPtr
向右走------> 遇括号
转向--------> 遇* ,funcPtr是一个指针 ,又是括号
转向--------> 一个空参数表(不带参数的函数)
向左走------> void
返回值------> void
最终结果是: funcPtr是一个指针,它指向一个不带参数并返回void的函数。
再看几个更复杂的:
void *(*(*fp1)(int))[10];
fp1是一个指向函数的指针,它接受一个int参数并返回一个指向含有10个void指针数组的指针(void * [10])。
float (*(*fp2)(int,int,float))(int);
fp2是一个指向函数的指针,它接受三个参数:int, int, float且返回一个指向函数的指针,该函数有一个int参数并返回一个float。
typedef double (*(*(*fp3)())[10])(); //返回值为:double (*(*)[10])();
fp3 a;
fp3是一个指向函数的指针,该函数无参数并返回一个指向含有10个指向函数指针数组的指针,这些函数不接受参数并返回double值.
int (*(*f4())[10])(); //返回值为 int(*([10]))();
f4是一个返回指针的函数,该指针指向含有10个函数指针的数组,这些函数返回整型值.
总结:
我们可能很少甚至是从不使用过如此复杂的声明和定义,但如果通过练习能把它搞清楚的话,就不会在现实生活中可能遇到的稍微复杂的情况所困惑!
参考资料: <>
复杂的声明和定义
最新推荐文章于 2021-05-19 02:25:30 发布
博客介绍了复杂函数指针声明的解析方法,即从中间开始,向外扩展并挖空括号。通过多个例子,如void(*funcPtr)()、void *(*(*fp1)(int))[10]等,详细展示了解析过程,最后总结掌握此方法可应对现实中稍复杂的情况。
4043

被折叠的 条评论
为什么被折叠?



