那么。。。祝你好运,请用伪lambda描述方式拆解下面函数和函数指针:
int (*pfunc4)(int*()); int (*func10(int[]))[10]; int (*func11(int[], int))(int, int); int (*(*pfunc5)(int))(int[10], int); int (*(*pfunc6)(int[10]))[10]; int (*(*pfunc7[10])(int[10]))[10]; int (*pfunc8(int(*(int(*()))))); int (*(*(*pfunc9)[10])(int[], int))(int, int);int (*pfunc4)(int*()); 基本上都倒在了形参的int*()这种什么鬼写法是吧,不然这怎么能叫恶魔指针呢,哈哈哈... 反正在这篇文章里,就让可读性就统统见鬼去吧!如果你有Visual Studio的话,把这份声明粘贴到VS,然后光标放在上面,你会发现实际上形参的int*()会被解读为int*(*)()。 答案:(*pfunc4)((*pf)()->int*)->int
int (*func10(int[]))[10]; 这个在《C++ Primer》上似曾相识,如果你之前在里面做过类似的题目话,就会知道这个函数,返回的是一个指向数组的指针。你可以将该函数类似于函数调用的部分func10(int*)拿掉,剩下的就是返回值类型int(*)[10]了。 答案:func10(int*)->int(*)[10]
int (*func11(int[], int))(int, int); 函数返回了一个函数指针。 答案:func11(int*, int)->int(*)(int, int)
int (*(*pfunc5)(int))(int[10], int); 函数指针,所指函数返回了一个函数指针。 答案:(*pfunc5)(int)->((*)(int*, int)->int)
int (*(*pfunc6)(int[10]))[10]; 答案:(*pfunc6)(int*)->int(*)[10]
int (*(*pfunc7[10])(int[10]))[10]; 答案:(*pfunc7[10])(int*)->int(*)[10]
int (*pfunc8(int(*(int(*()))))); 这又是什么鬼玩意???我们先根据现有的经验来进行层层解耦。首先像这种int(*())的外层括号是可以去掉的,只是一个误导,然后就变成了int*()的鬼形式,然后编译器会认为它是int*(*)()。那答案也就呼之欲出了。 答案:(*pfunc8)((*pf1)((*pf2)()->int*)->int*)->int*
int (*(*(*pfunc9)[10])(int[], int))(int, int); 答案:((*pfunc9)[10])(int*, int)->((*pf)(int, int)->int)
结语如果你能完成上面的所有题目,那么你将获得隐藏称号:人形编译器。
这里的指针几乎就是你这辈子能见到的所有指针了。至于其余变种指针,基本上都围绕这上面提到的方法构成。毕竟我们还没加上C++的引用呢...
欢迎在评论里面留下自己的段位证明(请诚实对待)。坑挖的太大也难免会有一些错漏,欢迎指正。
现在,我们都是恶魔了