【基础知识】函数指针

1 什么是函数指针

函数指针是一个指向函数的指针变量,它可以指向某个函数的入口地址,使得程序可以通过该指针变量调用该函数。函数指针本身是一种数据类型,其类型与所指向函数的返回值类型和参数类型有关。使用函数指针可以实现动态调用函数,也就是在程序运行时根据需要动态地选择调用哪个函数。

函数指针通常用于函数回调的场景,也就是将一个函数作为参数传递给另一个函数,让后者在适当的时候调用前者。例如,可以将一个排序算法的比较函数作为参数传递给排序函数,让后者根据比较函数的结果对数据进行排序。

函数指针的定义方式类似于变量的定义,只不过需要加上括号和星号。例如,要定义一个指向返回‘int’类型、带有两个‘int’参数的函数的指针,可以这样写:

int (*func_ptr)(int, int);

这里‘func_ptr’是指向函数的指针变量,它可以指向任何返回‘int’类型、带有两个‘int’参数的函数。

2如何定义一个函数指针

函数指针的定义格式为:

函数返回值类型 (*指针变量名称)(参数列表)

例如:

    int  (*p)( int x, int y)

p 是一个指针,它指向一个函数,该函数有 2 个整形参数,返回类型为 int 。p 首先与 * 结合,表明 p 是一个指针,然后再与 ( ) 结合,表明它指向的是一个函数。指向函数的指针也称为函数指针。

3 如何给函数指针赋值

要给函数指针赋值,可以将其指向一个具体的函数。具体来说,可以将函数的地址赋值给函数指针,也可以使用函数名直接给函数指针赋值。下面分别介绍两种方法。

(1)将函数的地址赋值给函数指针

可以使用取地址运算符‘&’来获取函数的地址,然后将该地址赋值给函数指针。

例如:

int add(int x, int y){    return x+y;}

可以定义一个指向‘add’函数的指针,并将其指向‘add’函数的地址,如下所示:

int (*func_ptr)(int, int) = &add;

这里‘&add’表示‘add’函数的地址,将其赋值给‘func_ptr’指针变量。然后通过函数指针来调用该函数,例如:

int result = (*func_ptr)(3,4);//调用add(3,4),result=7

这里使用了括号,是因为函数调用的优先级高于指针解引用的优先级,所以需要先解引用指针,再调用函数。

(2)直接使用函数名给函数指针赋值

在 C 语言中,函数名实际上就是该函数的地址,因此可以直接使用函数名来给函数指针赋值。例如,可以定义一个指向‘add’函数的指针,并将其指向‘add’函数的地址,如下所示:

int (*func_ptr)(int, int) = add;

这里不需要使用取地址符‘&’,直接使用‘add’函数名即可。然后可以通过函数指针来调用该函数,例如:

int result = (*func_ptr)(3,4); //调用add(3,4),result=7

这里的调用方式与前面相同,先解引用指针,再调用函数。

4 如何调用函数指针

调用函数指针需要使用指针解引用和函数调用运算符,具体步骤如下:

(1)使用指针解引用获取函数地址所对应的函数

(2)使用函数调用运算符调用该函数,并传递相应的参数

假如有以下函数指针:

int (*func_ptr)(int, int)

它指向一个返回‘int’类型、带有两个‘int’参数的函数,可以通过指针解引用和函数调用运算符来调用该函数,例如:

int result = (*func_ptr)(3, 4); //调用 func_ptr 所指向的函数,传递参数3和4

这里的‘(*func_ptr)’表示对函数指针解引用,获取其指向的函数地址所对应的函数。然后使用函数调用运算符‘(3, 4)’来调用该函数,并传递相应的参数。

注意:

函数指针所指向的函数的参数类型和个数必须与调用时传递的参数类型和个数匹配,否则可能会导致错误或未定义行为。