zoukankan      html  css  js  c++  java
  • 花式函数指针

    ****2010年 08月 22日 星期日 02:07:00 CST
      前一段时间些的东西,本身是贴在百度空间的,现在拿过来凑凑数吧 :)。
      关于这些函数指针没有解释太多,只是想让大家看看函数指针的强大,算是胡乱涂鸦吧。其实只要掌握组合的规则,函数指针还是很简单的,只是看上去眼花缭乱,很唬人,所以在此就叫“花式函数指针”吧。

      函数指针的常规用法

    /* pfunc1.c */
    #include <stdio.h>

    int func_1(int a) {
    printf("in func_1 a = %d\n", a);
    return a;
    }

    int main(void) {
    int (*pfunc_1)(int) = func_1;
    printf("pfunc_1 return %d\n", pfunc_1(5));
    return 0;
    }


            参数函数指针、返回函数指针

    /* pfunc2.c */
    #include <stdio.h>

    int func_1(int a) {
    printf("in func_1 a = %d\n", a);
    return a;
    }

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

    int main(void) {
    int (*(*pfunc_2)(int, int, int (*)(int)))(int) = func_2;
    printf("pfunc_2(2, 3, func_1)(5) return %d\n", pfunc_2(2, 3, func_1)(5));;
    return 0;
    }


            函数指针数组

    /* pfunc3.c */
    #include <stdio.h>

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

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

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

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

    int main(void) {
    int i;
    for (i = 0; i < 3; ++i)
    (*arrfunc[i])(i);
    return 0;
    }


            参数函数指针数组,返回函数指针

    /* pfunc4.c */
    #include <stdio.h>

    void func1(int num) {
    printf("func1 num = %d\n", num);
    }
    void func2(int num) {
    printf("func2 num = %d\n", num);
    }
    void func3(int num) {
    printf("func3 num = %d\n", num);
    }
    void (*arrfunc[10])(int num)={func1, func2, func3};
    void (*rtn_pfunc(int a, int b, int arr_num, void (*arrfunc[])(int)))(int) {
    printf("in rtn_pfunc a=%d b=%d\n", a, b);
    return (arr_num > 0) ? arrfunc[1] : NULL;
    }

    int main(void) {
    int i;
    void (*(*prtn_pfunc)(int, int, int, void (*[])(int)))(int) = rtn_pfunc;
    for (i = 0; i < 3; ++i)
    (*arrfunc[i])(i);
    prtn_pfunc(2, 3, 3, arrfunc)(5);

    return 0;
    }


            参数函数指针、函数指针数组的指针,返回函数指针数组的指针

    /* pfunc5.c */
    #include <stdio.h>
    #include <stdlib.h>

    void func1(int num) {
    printf("func1 num = %d\n", num);
    }
    void func2(int num) {
    printf("func2 num = %d\n", num);
    }
    void func3(int num) {
    printf("func3 num = %d\n", num);
    }

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

    void (*(*rtn_pfuncarr(void (*pfunc1)(int), void (*pfunc2)(int), void (*pfunc3)(int), void (*(*parrfunc)[])(int)))[])(int) {
    int i;
    void (*(*prtn_arr)[])(int);
    if ((prtn_arr = (void (*(*)[])(int))malloc(3*sizeof(void (*)(int)))) == NULL) {
    perror("malloc ERROR ");
    exit(1);
    }
    (*prtn_arr)[0] = pfunc1;
    (*prtn_arr)[1] = pfunc2;
    (*prtn_arr)[2] = pfunc3;
    for (i = 0; i < 3; ++i)
    (*parrfunc)[i](i);
    return prtn_arr;
    }


    int main(void) {
    int i;
    void (*(*((*prtn_pfuncarr)(void (*)(int), void (*)(int), void (*)(int), void (*(*)[])(int))))[])(int) = rtn_pfuncarr;
    void (*(*prtn_arr)[])(int);
    prtn_arr = prtn_pfuncarr(func1, func2, func3, &arrfunc);
    for (i = 0; i < 3; ++i)
    (*prtn_arr)[i](i+10);
    //free(prtn_arr);
    return 0;
    }


      函数rtn_pfuncarr有四个参数,前三个为函数指针;最后一个也为指针,该指针指向一个函数指针数组;函数返回一个指针,该指针指向一个函数指针数组(此处为malloc动态分配的空间)

      最后这个似乎已经开始变的有点bt,还是不往下写了吧。 :)

    (转载时请注明作者和出处。未经许可,请勿用于商业用途)

  • 相关阅读:
    (error) DENIED Redis is running in protected mode because protected mode is enabled
    boost库安装和使用
    linux下Redis以及c++操作
    Redis 客户端安装与远程连接图解
    Redis 安装和配置
    terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::substr
    C++ STL std::wstring_convert处理UTF8
    C++正确的cin输入
    分词之最短编辑距离算法实现(包括中文)
    unicode和utf-8互转
  • 原文地址:https://www.cnblogs.com/logicbaby/p/1852409.html
Copyright © 2011-2022 走看看