函数指针的定义与使用

函数的本质

函数的本质是一段可执行性代码段。函数名,则是指向这段代码段的首地址。

#include <stdio.h>


void print()
{
    printf("china\n");
}
void dis()
{
    printf("china\n");
} 

int main()
{
    void (*pf)() = print; //void (*pf)() = &print; //此两种形式的的赋值方式都是没有问题的。
    pf(); //(*pf)();
    pf = dis;
    pf();
    return 0;
}

1)上述代码中函数void print()和void dis()他们都有一个公共的类型就是void (*)(void);

2)使用void (*)(void)类型定义了一个变量名为p的函数指针,并且对其赋值;

 

更简洁的表示方式

当函数类型较为复杂时,我们往往使用typedef来定义一个简洁的类型名称使之更容易使用。

例如:typedef void (*PFUNC)();这时候我们就可以这样去使用:

typedef void (*PFUNC)() ;

int main()
{
    PFUNC pf= print;
    pf();
    pf = dis;
    pf();
    return 0;
}

 

应用场景

函数指针的一个用法出现在菜单驱动系统中。例如程序可以提示用户输入一个整数
值来选择菜单中的一个选项。 用户的选择可以做函数指针数组的下标, 而数组中的
指针可以用来调用函数。

#include <stdio.h>
void function0(int);
void function1(int);
void function2(int);

int main()
{

    void (*f[3])(int) = {function0,function1,function2};
    //将这 3 个函数指针保存在数组 f 中
    int choice;
    printf("Enter a number between 0 and 2, 3 to end: ");
    scanf("%d",&choice);
    while ((choice >= 0) && (choice <3))
    {
        (f[choice])(choice);//(*f[choice])(choice);这种写法亦可
        //f[choice]选择在数组中位置为 choice 的指针。
        //指针被解除引用, 以调用函数, 并且 choice 作为实参传递给这个函数。
        printf("Enter a number between 0 and 2,3 to end: ");
        scanf("%d",&choice);
    }
    printf("Program execution completed.");
    return 0;
}

void function0(int a)
{
    printf("You entered %d so function0 was called\n",a);
}

void function1(int b)
{
    printf("You entered %d so function1 was called\n",b);
}

void function2(int c)
{
    printf("You entered %d so function2 was called\n",c);
}

 

回调函数

#include <stdio.h>

int callBackCompare(int a,int b)
{
    return a<b?1:0;
} 

void selectSort(int *p, int n,int(*pf)(int,int))
{
    for(int i=0; i<n-1 ;i ++)
    {
        for(int j=i+1; j<n; j++)
        {
            if(pf(p[i],p[j]))
            {
                p[i] = p[i]^p[j];
                p[j] = p[i]^p[j];
                p[i] = p[i]^p[j];
            }
        }
    }
} 
int main(void)
{
    int arr[10] = {6,5,4,3,2,1,7,8,9,0};
    selectSort(arr,10,callBackCompare);
    for(int i=0; i<10; i++)
    {
        printf("%d\n",arr[i]);
    }
    return 0;
}

回调函数本质
回调函数,本质也是一种函数调用,先将函数以指针的方式传入,然后,调用。这种写
法的好处是,对外提供函数类型,而不是函数定义。这样我们只需要依据函数类型
和函数功能提供函数就可以了。给程序的书写带来了很大的自由。

 

posted @ 2018-06-17 22:50  小念之歌  阅读(5694)  评论(0编辑  收藏  举报