typedef int (* func)(int ,int )

来源:互联网 发布:软件项目管理内容 编辑:程序博客网 时间:2024/04/29 07:14

1.简单的函数指针的应用

形式1:返回类型(*函数名)(参数表) 

[cpp] view plain copy
  1. char (*pFun)(int);   
  2. char glFun(int a){ return;}   
  3. void main()   
  4. {   
  5.     pFun = glFun;   
  6.     (*pFun)(2);   
  7. }  


         第一行定义了一个指针变量pFun。首先我们根据前面提到的“形式1”认识到它是一个指向某种函数的指针,这种函数参数是一个int型,返回值是char类型。只有第一句我们还无法使用这个指针,因为我们还未对它进行赋值。
         第二行定义了一个函数glFun()。该函数正好是一个以int为参数返回char的函数。我们要从指针的层次上理解函数——函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址
         然后就是main()函数了,它的第一句您应该看得懂了——它将函数glFun的地址赋值给变量pFun。main()函数的第二句中“*pFun”显然是取pFun所指向地址的内容,当然也就是取出了函数glFun()的内容,然后给定参数为2。

2.使用typedef更直观更方便

形式1:typedef  返回类型(*新类型)(参数表)

[cpp] view plain copy
  1. typedef char (*PTRFUN)(int);   
  2. PTRFUN pFun;   
  3. char glFun(int a){ return;}   
  4. void main()   
  5. {   
  6.     pFun = glFun;   
  7.     (*pFun)(2);   
  8. }   

            typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。后面就可以像使用int,char一样使用PTRFUN了。
           第二行的代码便使用这个新类型定义了变量pFun,此时就可以像使用形式1一样使用这个变量了。










先看一下例子:

#include "iostream"

using namespace std;

int add(int a,int b){
return (a+b);
}

typedef int (* func)(int ,int ) ;

void main(){
func f = add;
int n = f(1,2);
cout << n << endl;
}

其中 typedef int (* func)(int ,int ) 比较难理解,因为我们知道typedef 是宏定义,一般的语法是这样:

typedef unsigned long ulong;

这个定义是用ulong作unsigned long 的别名

在这里的意思是定义一种指针类型lpAddFun,它是一种指向函数int (int,int)的指针,也就是说lpAddFun表示的是这种类型的函数的地址,因为:

函数名不是其类型的一部分函数的类型只由它的返回值和参数表决定.指向add()的指针必须指向与add()相同类型的函数带有相同的返回类型和相同的参数表   。

int (* func)(int ,int )和int* func(int ,int )是不同的,后者说明的是返回一个int类型的指针,所以括号是必须加的

例题:

#include<stdio.h>
int inc(int a)
{
return(++a);
}


int multi(int*a,int*b,int*c)
{
return(*c=*a**b);
}


typedef int(FUNC1)(int);
typedef int(FUNC2) (int*,int*,int*);

void show(FUNC2 fun,int arg1, int *arg2)
{
//fun 为指向函数int multi(int*a,int*b,int*c)的指针
//arg1 = 10,arg2 =&a;

 FUNC1 *p = &inc;         //p为指向函数inc的指针
int temp =p(arg1);                //等价于 temp = inc(arg1) = inc(10) = 11
fun(&temp,&arg1, arg2);  

//运行fun()函数后,*arg2 = temp * arg1 = 11 * 10 = 110

printf("%d\n",*arg2);
}

int main()
{
int a;
show(multi,10,&a);
return 0;
}

结果:110

0 0