# C - 函数指针

> 原文： [https://beginnersbook.com/2014/01/c-function-pointers/](https://beginnersbook.com/2014/01/c-function-pointers/)

在 [C 编程语言](https://beginnersbook.com/2014/01/c-tutorial-for-beginners-with-examples/)中，我们可以有一个概念，称为**指向函数的指针**。在本教程中，我们将学习如何声明函数指针以及如何使用此指针调用函数。要理解这个概念，你应该具备[函数](https://beginnersbook.com/2014/01/c-functions-examples/)和[指针](https://beginnersbook.com/2014/01/c-pointers/)的基本知识。**

## 如何声明函数指针？

```c
function_return_type(*Pointer_name)(function argument list)
```

例如：

```c
double  (*p2f)(double, char)
```

这里`double`是函数的返回类型，`p2f`是函数指针的名称，`(double, char)`是这个函数的参数列表。这意味着此函数的第一个参数是`double`类型，第二个参数是`char`类型。

让我们借助一个例子来理解这一点：这里我们有一个函数`sum`，它计算两个数字的总和并返回总和。我们创建了一个指向此函数的指针`f2p`，我们使用此函数指针`f2p`调用该函数。

```c
int sum (int num1, int num2)
{
    return num1+num2;
}
int main()
{

    /* The following two lines can also be written in a single
     * statement like this: void (*fun_ptr)(int) = &fun;
     */
    int (*f2p) (int, int);
    f2p = sum;
    //Calling function using function pointer
    int op1 = f2p(10, 13);

    //Calling function in normal way using function name
    int op2 = sum(10, 13);

    printf("Output1: Call using function pointer: %d",op1);
    printf("\nOutput2: Call using function name: %d", op2);

    return 0;
}

```

**输出：**

```c
Output1: Call using function pointer: 23
Output2: Call using function name: 23
```

**关于函数指针的一些要点：**

1.  如注释中所述，您可以在单个语句中声明一个函数指针并为其赋值函数，如下所示：

```c
void (*fun_ptr)(int) = &fun;
```

2.  您甚至可以从此语句中删除`&`符号，因为单独的函数名称表示函数地址。这意味着上面的语句也可以这样写：

```c
void (*fun_ptr)(int) = fun;
```