C 函数指针

在 C 语言中,函数指针是一个指向函数的指针。使用函数指针,可以让你将函数保存到一个变量中,或者将函数作为另一个函数的参数传递进去等。

C 函数指针语法

在 C 语言中,数组指针指的是 “数组的指针”。对于一个数组来说,C 语言会为它分配一块连续的内存空间,然后它的指针就是这一块内存空间的开始地址。

而函数指针,指的是 “函数的指针”。对于一个函数来说,C 语言同样会为它分配一块连续的内存空间,这一块内存空间同样有一个开始地址。对于函数指针,它其实就是一个函数所占内存空间中的开始地址。

很多初学者认为 “函数” 只是一个抽象性的东西,和 “数组” 这种具体性的东西不一样,然后以为函数不会占据内存空间。这样去理解其实就是错误的,因为函数本身是一个代码块,这个代码块也要放到内存里面才能被执行,所以肯定要占据内存空间了。

所以小伙伴们应该知道了,对于数组来说,它存放在内存中的是一个数据集合。对于函数来说,它存放在内存中就是函数本身的代码块,然后函数指针就是整个函数代码块的首地址。

C 函数指针的语法

语法:

类型名 (*指针名)(参数列表)

C 函数指针示例

接下来,我们通过一个简单的例子来讲解一下 C 函数指针是如何使用的。

示例:使用 C 函数指针

#include <stdio.h>

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

int main(void)
{
    int (*p)(int, int);         // 声明一个名为 p 的函数指针

    p = sum;                    // 将 p 指向函数
    int result = p(10, 20);     // 通过函数指针调用函数
    printf("%d", result);

    return 0;
}

运行结果如下。

30

分析:

int (*p)(int, int); 表示定义了一个名为 p 的函数指针变量。p 是一个指针,它指向一个函数,该函数接收两个 int 参数并返回 int。

函数指针变量的定义其实和函数定义部分很相似,小伙伴们可以对比一下。对于函数指针变量定义,“(*p)” 外面的 “()” 是不能省略的,表示它的强调部分是 “(*p)”,这一点和数组指针是一样的。

我们都知道,数组名代表的就是该数组的开始地址,而函数名代表其实也是该函数的开始地址。所以这里将一个函数名赋值给一个指针变量 p,其实就是将函数的开始地址赋值给 p。从上面也可以知道,想要调用一个函数,我们有 2 种方式:① 函数名 ();② 指针名 ()。

提示: 函数指针看似对日常编程没什么用处,事实并非如此。实际上,它最大的作用就是可以使得一个函数作为另一个函数的参数传递进去,从而实现高阶函数。比如 C 标准库中一些功能最强大的函数,都是要求把函数指针作为参数,比如 <stdlib.h> 库中给任何数组排序的 qsort() 函数。

上一篇: C 指针数组

下一篇: C 指针函数

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号