- 论坛徽章:
- 0
|
俺也发篇指针的东西,去年写的,暂且叫花式函数指针
http://www.cnblogs.com/logicbaby/articles/1852409.html
关于这些函数指针没有解释太多,只是想让大家看看函数指针的强大,算是胡乱涂鸦吧。其实只要掌握组合的规则,函数指针还是很简单的,只是看上去眼花缭乱,很唬人,所以在此就叫“花式函数指针”吧。
1、函数指针的常规用法- /* 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;
- }
复制代码 2、参数函数指针、返回函数指针- /* 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;
- }
复制代码 3、函数指针数组- /* 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;
- }
复制代码 4、参数函数指针数组,返回函数指针- /* 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;
- }
复制代码 5、参数函数指针、函数指针数组的指针,返回函数指针数组的指针- /* 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,还是不往下写了吧。  |
|