当前位置:文档之家› 指向函数的指针

指向函数的指针

指向函数的指针c/c++ 2010-11-20 13:17:02 阅读41 评论0 字号:大中小订阅首先看这个程序:#include <iostream>using namespace std;void max(int a, int b){cout<<"now call max("<<a<<","<<b<<")..."<<endl;int t = a>b?a:b;cout<<t<<endl;}void min(int a, int b){cout<<"now call min("<<a<<","<<b<<")..."<<endl;int t = a<b?a:b;cout<<t<<endl;}typedef void (*myFun)(int a, int b); //定义一个函数指针用来引用max,min//回调函数void callback(myFun fun, int a, int b){fun(a,b);}void main(){int i = 10;int j = 55;callback(max,i,j);callback(min,i,j);}编译结果:now call max(10,55)...55now call min(10,55)...10Press any key to continue回调函数是一种例子。

我曾经写过一个命令行程序,有很多命令,于是构着了一个结构的数组,大概是这样struct{char *cmd_name;bool (*cmd_fun)();}cmd_info_list[MAX_CMD_NUM];程序中得到一个用户输入的命令字符串后,就匹配这个数组,找到对应的处理函数。

以后每次添加一个命令,只需要加个函数,然后在这个数组中加一个记录就可以了,不需要修改太多的代码。

这可以算是一种用法吧。

呵呵。

Windows 中,窗口的回调函数就用到了函数指针。

用VC向导New Projects ----> Win32 Application ----> A typical "Hello World!" application其中的WndProc 是WNDPROC 类型的函数typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM); WndProc 作为窗口的回调函数,用来填充WNDCLASSEX 结构。

WNDCLASSEX wcex;wcex.lpfnWndProc = (WNDPROC)WndProc;void ListTraverse(LinkList L,void (*visit)(int)){Link p;p=L->next;while(p){visit(p->data);p=p->next;}return OK;}void print(int c){printf("%d",c);}ListTraverse(L,print);这算是个例子吧???#include<stdio.h>#include<stdlib.h>#include<math.h>double Add (double x, double y){return x+y;}double Sub (double x, double y){return x-y;}double Mul (double x, double y){return x*y;}double Div (double x, double y){return x/y;}/*5个“函数指针”的数组*/double (*funcTable[5])( double, double )={ Add, Sub, Mul, Div, pow };char *msgTable[5] = { "Sum", "Difference", "Product", "Quotient", "Power" };int main(){int i;double x=12.5, y=4;printf("Input 2 operands for some arithmetic:\n");if(scanf("%lf %lf",&x,&y)!=2){printf("Invalid input.\n");}for (i=0; i<5; ++i){printf( "%10s: %6.2f\n", msgTable[i], funcTable[i](x,y) );}return 0;}参考资料:C in a nutshell. (美)Peter Prinz & (美)Tony Crawford************************************************************************************************************ /parad1se/blog/item/f11ee9314df97c11eac4aff7.html代码简化, 促进跨平台开发的目的.typedef 行为有点像#define 宏,用其实际类型替代同义字。

不同点:typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换。

用法一:typedef int (*MYFUN)(int, int);这种用法一般用在给函数定义别名的时候上面的例子定义MYFUN 是一个函数指针, 函数类型是带两个int 参数, 返回一个int在分析这种形式的定义的时候可以用下面的方法:先去掉typedef 和别名, 剩下的就是原变量的类型.去掉typedef和MYFUN以后就剩:int (*)(int, int)用法二:typedef给变量类型定义一个别名.typedef struct{int a;int b;}MY_TYPE;这里把一个未命名结构直接取了一个叫MY_TYPE的别名, 这样如果你想定义结构的实例的时候就可以这样:MY_TYPE tmp;第二种用法:typedef 原变量类型别名typedef补充内容:例如:typedef int (*PF) (const char *, const char *);这个声明引入了PF 类型作为函数指针的同义字,该函数有两个const char * 类型的参数以及一个int 类型的返回值。

简单的函数指针的用法//形式1:返回类型(*函数名)(参数表)char(*pFun)(int);char glFun(int a){return;}void main(){pFun =glFun;(*pFun)(2);}第一行定义了一个指针变量pFun.它是一个指向某种函数的指针,这种函数参数是一个int类型,返回值是char类型。

只有第一句我们还无法使用这个指针,因为我们还未对它进行赋值。

第二行定义了一个函数glFun().该函数正好是一个以int为参数返回char的函数。

我们要从指针的层次上理解函数-函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址。

使用typedef更直接typedef char(*PTRFUN)(int)PTRFUN pFun;char glFun(int a){return;}void main(){pFun = glFun;(*pFun)(2);}typedef的功能是定义新的类型。

第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////下面是个例子://////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////在typedef的使用中,最麻烦的是指向函数的指针,如果没有下面的函数,你知道下面这个表达式的定义以及如何使用它吗?int (*s_calc_func(char op))(int, int);如果不知道,请看下面的程序,里面有比较详细的说明// 定义四个函数int add(int, int);int sub(int, int);int mul(int, int);int div(int, int);// 定义指向这类函数的指针typedef int (*FP_CALC)(int, int);// 我先不介绍,大家能看懂下一行的内容吗?int (*s_calc_func(char op))(int, int);// 下一行的内容与上一行完全相同,// 定义一个函数calc_func,它根据操作字符op 返回指向相应的计算函数的指针FP_CALC calc_func(char op);// 根据op 返回相应的计算结果值int calc(int a, int b, char op);int add(int a, int b){return a + b;}int sub(int a, int b){return a - b;}int mul(int a, int b){return a * b;}int div(int a, int b){return b? a/b : -1;}// 这个函数的用途与下一个函数作业和调用方式的完全相同,// 参数为op,而不是最后的两个整形int (*s_calc_func(char op)) (int, int){return calc_func(op);}FP_CALC calc_func(char op){switch (op){case '+': return add;case '-': return sub;case '*': return mul;case '/': return div;default:return NULL;}return NULL;}int calc(int a, int b, char op){FP_CALC fp = calc_func(op); // 下面是类似的直接定义指向函数指针变量// 下面这行是不用typedef,来实现指向函数的指针的例子,麻烦!int (*s_fp)(int, int) = s_calc_func(op);// ASSERT(fp == s_fp); // 可以断言这俩是相等的if (fp) return fp(a, b);else return -1;}void test_fun(){int a = 100, b = 20;printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));}运行结果calc(100, 20, +) = 120calc(100, 20, -) = 80calc(100, 20, *) = 2000calc(100, 20, /) = 5。

相关主题