C 语言函数指针作为参数

16 Apr 2025 | 3 分钟阅读

到目前为止,我们已经看到在 C 编程中,我们可以将变量作为参数传递给函数。我们不能将函数作为参数传递给另一个函数。但是我们可以通过使用函数指针将函数的引用作为参数传递。这个过程被称为按引用调用,因为函数参数作为指针传递,它保存了参数的地址。如果函数使用指针进行了任何更改,那么这些更改也会反映在传递变量的地址上。

因此,C 编程允许您创建一个指向函数的指针,该指针可以进一步作为参数传递给函数。我们可以按如下方式创建函数指针

在上面的语法中,type 是函数返回的变量类型,*pointer_name 是函数指针,parameter 是传递给函数的参数列表。

让我们看一个例子

函数指针也可以指向另一个函数,或者我们可以说它保存了另一个函数的地址。

在上面的例子中,我们声明了一个名为“add”的函数。我们还声明了函数指针 (*a),它返回浮点类型的值,并包含两个整型参数。现在,我们可以将 add() 函数的地址赋值给 'a' 指针,因为它们具有相同的返回类型(float)和相同类型的参数。

现在,'a' 是一个指向 add() 函数的指针。我们可以使用指针 'a' 调用 add() 函数。让我们看看如何做到这一点

以上语句使用指针 'a' 调用 add() 函数,并将两个参数(即 2 和 3)传递给 'a'。

让我们看一个简单的例子,说明如何将函数指针作为参数传递。

在上面的代码中,

  • 我们定义了两个函数,分别命名为 'display()' 和 print_numbers()。
  • 在 main() 方法内部,我们声明了一个名为 (*p) 的函数指针,并调用 display() 函数,其中我们传递 print_numbers() 函数。
  • 当控制流进入 display() 函数时,指针 *p 包含 print_numbers() 函数的地址。这意味着我们可以使用函数指针 *p 调用 print_numbers() 函数。
  • 在 display() 函数的定义中,我们定义了一个 'for' 循环,在 for 循环内部,我们使用语句 p(i) 调用 print_numbers() 函数。这里,p(i) 意味着在 'i' 的每次迭代中都会调用 print_numbers() 函数,并打印 'i' 的值。

输出

Function pointer as argument in C

现在,我们将函数指针作为参数传递给快速排序函数 "qsort"。它使用一种对数组进行排序的算法。

在上面的代码中,

  • 我们定义了一个整型数组。创建数组后,我们使用 sizeof() 运算符计算数组的大小,并将大小存储在 num 中。
  • 我们定义了一个 compare() 函数,它比较数组中的所有元素并将它们按升序排列。
  • 我们还声明了函数指针,即 (*f),并通过使用语句 f=&compare 将 compare() 函数的地址存储在 (*f) 中。
  • 我们调用 qsort() 函数,其中我们传递数组、数组的大小、元素的大小以及比较函数。比较函数,即 compare() 将比较数组元素,直到数组中的元素按升序排序。

输出

Function pointer as argument in C
下一主题测试/c-指针-1