免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2310 | 回复: 6
打印 上一主题 下一主题

花式函数指针 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-28 12:42 |只看该作者 |倒序浏览
俺也发篇指针的东西,去年写的,暂且叫花式函数指针
http://www.cnblogs.com/logicbaby/articles/1852409.html

  关于这些函数指针没有解释太多,只是想让大家看看函数指针的强大,算是胡乱涂鸦吧。其实只要掌握组合的规则,函数指针还是很简单的,只是看上去眼花缭乱,很唬人,所以在此就叫“花式函数指针”吧。
  1、函数指针的常规用法
  1. /* pfunc1.c */
  2. #include <stdio.h>

  3. int func_1(int a) {
  4.         printf("in func_1 a = %d\n", a);
  5.         return a;
  6. }

  7. int main(void) {
  8.         int (*pfunc_1)(int) = func_1;
  9.         printf("pfunc_1 return %d\n", pfunc_1(5));
  10.         return 0;
  11. }
复制代码
2、参数函数指针、返回函数指针
  1. /* pfunc2.c */
  2. #include <stdio.h>

  3. int func_1(int a) {
  4.         printf("in func_1 a = %d\n", a);
  5.         return a;
  6. }

  7. int (*func_2(int a, int b, int (*pfunc_1)(int)))(int) {
  8.         printf("in func_2 a = %d b = %d\tcall pfunc_1(5) return %d\n", a, b, pfunc_1(5));
  9.         return pfunc_1;
  10. }

  11. int main(void) {
  12.         int (*(*pfunc_2)(int, int, int (*)(int)))(int) = func_2;
  13.         printf("pfunc_2(2, 3, func_1)(5) return %d\n", pfunc_2(2, 3, func_1)(5));;
  14.         return 0;
  15. }
复制代码
3、函数指针数组
  1. /* pfunc3.c */
  2. #include <stdio.h>

  3. void func1(int num) {
  4.         printf("func1 num = %d\n", num);
  5. }

  6. void func2(int num) {
  7.         printf("func2 num = %d\n", num);
  8. }

  9. void func3(int num) {
  10.         printf("func3 num = %d\n", num);
  11. }

  12. void (*arrfunc[10])(int num)={func1, func2, func3};

  13. int main(void) {
  14.         int i;
  15.         for (i = 0; i < 3; ++i)
  16.                 (*arrfunc[i])(i);
  17.         return 0;
  18. }
复制代码
4、参数函数指针数组,返回函数指针
  1. /* pfunc4.c */
  2. #include <stdio.h>

  3. void func1(int num) {
  4.         printf("func1 num = %d\n", num);
  5. }
  6. void func2(int num) {
  7.         printf("func2 num = %d\n", num);
  8. }
  9. void func3(int num) {
  10.         printf("func3 num = %d\n", num);
  11. }
  12. void (*arrfunc[10])(int num)={func1, func2, func3};
  13. void (*rtn_pfunc(int a, int b, int arr_num, void (*arrfunc[])(int)))(int) {
  14.         printf("in rtn_pfunc a=%d b=%d\n", a, b);
  15.         return (arr_num > 0) ? arrfunc[1] : NULL;
  16. }

  17. int main(void) {
  18.         int i;
  19.         void (*(*prtn_pfunc)(int, int, int, void (*[])(int)))(int) = rtn_pfunc;
  20.         for (i = 0; i < 3; ++i)
  21.                 (*arrfunc[i])(i);
  22.         prtn_pfunc(2, 3, 3, arrfunc)(5);

  23.         return 0;
  24. }
复制代码
5、参数函数指针、函数指针数组的指针,返回函数指针数组的指针
  1. /* pfunc5.c */
  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. void func1(int num) {
  5.         printf("func1 num = %d\n", num);
  6. }
  7. void func2(int num) {
  8.         printf("func2 num = %d\n", num);
  9. }
  10. void func3(int num) {
  11.         printf("func3 num = %d\n", num);
  12. }

  13. void (*arrfunc[10])(int num)={func1, func2, func3};

  14. void (*(*rtn_pfuncarr(void (*pfunc1)(int), void (*pfunc2)(int), void (*pfunc3)(int), void (*(*parrfunc)[])(int)))[])(int) {
  15.         int i;
  16.         void (*(*prtn_arr)[])(int);
  17.         if ((prtn_arr = (void (*(*)[])(int))malloc(3*sizeof(void (*)(int)))) == NULL) {
  18.                 perror("malloc ERROR ");
  19.                 exit(1);
  20.         }
  21.         (*prtn_arr)[0] = pfunc1;
  22.         (*prtn_arr)[1] = pfunc2;
  23.         (*prtn_arr)[2] = pfunc3;
  24.         for (i = 0; i < 3; ++i)
  25.         (*parrfunc)[i](i);
  26.         return prtn_arr;
  27. }


  28. int main(void) {
  29.         int i;
  30.         void (*(*((*prtn_pfuncarr)(void (*)(int), void (*)(int), void (*)(int), void (*(*)[])(int))))[])(int) = rtn_pfuncarr;
  31.         void (*(*prtn_arr)[])(int);
  32.         prtn_arr = prtn_pfuncarr(func1, func2, func3, &arrfunc);
  33.         for (i = 0; i < 3; ++i)
  34.                 (*prtn_arr)[i](i+10);
  35.         //free(prtn_arr);
  36.         return 0;
  37. }
复制代码
函数rtn_pfuncarr有四个参数,前三个为函数指针;最后一个也为指针,该指针指向一个函数指针数组;函数返回一个指针,该指针指向一个函数指针数组(此处为malloc动态分配的空间) 。
  最后这个似乎已经开始变的有点bt,还是不往下写了吧。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
2 [报告]
发表于 2011-03-28 13:51 |只看该作者
折騰人啊

论坛徽章:
0
3 [报告]
发表于 2011-03-28 13:51 |只看该作者
太花了,为什么不用typedef。
如果工作中谁这么写,一定大耳刮子抽他

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
4 [报告]
发表于 2011-03-28 13:58 |只看该作者
C++还有成员函数指针

论坛徽章:
0
5 [报告]
发表于 2011-03-28 14:33 |只看该作者
说来说去,管你花不花,你不还是函数指针吗?

一篇都是没用的东西。。。

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
6 [报告]
发表于 2011-03-28 15:22 |只看该作者
想说明啥呢,搞得这么复杂

论坛徽章:
0
7 [报告]
发表于 2011-03-28 15:44 |只看该作者
    都说了是 花式 还有这么多人来真的了。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP