typedef int(FUNC1) (int in)

首先看一个例子:

#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,并没有用指针进行传递,这里其实是可以加入指针的,作用就是提高了传参效率,但是本题没有加入,也照样是可以的。

猜你喜欢

转载自blog.csdn.net/weixin_41556394/article/details/81131166
int