首先看一个例子:
#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(FUNC1 fun,int arg1,int *arg2)
{
FUNC1 *p=&inc;
int temp=p(arg1);
fun(&temp,&arg1,arg2);
}
main()
{
int a;
show(multi,10,&a);
return 0;
}
此处typedef是用来构造一个函数的模板的。一般的用法往往是这样typedef unsigned char uchar。相当于uchar是unsigned char的另外一个名字一样。
可如果就是函数指针的话,应该这样定义:int (*p) (),满足这样的才算是一个函数指针。这里顺便再提一下什么是指针函数以防混淆。形如:int *p (),这样的返回值为指针类型的函数就叫做指针函数。
关于这个程序我还想说以下几点:
1.函数的形参为什么要用指针类型。
看到第二个函数中
int multi(int *a,int *b,int *c)
{
return (*c = *a * *b);
}
用到了指针,我归纳出利用指针进行传参有两种明显的用途,一个是可以提高传参效率。比方说我们要传一个几百字节的结构体,那么利用指针传参,我们仅仅是需要传过来一个4字节的指针就可以代表这个结构体了。另外一个就是,可以改变某变量的值,并且将改变的值带回主函数中,最明显的例子就是swap函数,我们往往会用到指针进行传参,不然无法发生交换。
这里显然是想要改变某变量的值,当然方法不止这一种,如果不利用 指针而用函数中return 的返回特性同样可以达到效果,代码如下:
int multi(int a,int b)
{
return (a*b);
}
同样,我们看看后面的代码也就是show函数中,如果我们稍作修改,不利用指针,结果也是相同的:
void show(FUNC2 fun,int arg1, int arg2)
{
FUNC1 *p=&inc;
int temp=p(arg1);
fun(&temp,&arg1,&arg2);
printf("%d\n",arg2);
}
main()
{
int a;
show(multi,10,a);
return 0;
}
上述对代码的修改能够锻炼我们对指针的把握
2.关于函数的"赋值"问题
我们可以看到题目中对函数的赋值是这样的:
FUNC1 *p=&inc;
这里inc是一个函数名,如果想给p赋予和inc一样的功能,就要求采用地址传递的赋值方法
另外需要注意的一点是:
在main函数传参的时候,传入的multi函数名对应的直接就是FUNC2,并没有用指针进行传递,这里其实是可以加入指针的,作用就是提高了传参效率,但是本题没有加入,也照样是可以的。