花式函数指针

****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,还是不往下写了吧。 :)

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

原文地址:https://www.cnblogs.com/logicbaby/p/1852409.html