到目前为止,我们已经知道在C编程中,可以将变量作为函数的参数进行传递。但是,我们无法直接将函数作为参数传递给另一个函数。然而,通过使用函数指针,我们可以传递函数的引用作为参数。这个过程被称为按引用调用,因为函数参数以指针的形式传递,指针保存着参数的地址。如果函数使用指针进行修改,那么这些修改也会反映在传递变量的地址上。

因此,C编程允许我们创建指向函数的指针,并将其作为参数传递给其他函数。我们可以按照以下方式创建函数指针:

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

在上述语法中,返回值类型是函数返回的变量类型,*指针名称是函数指针的名称,参数列表是传递给函数的参数列表。

让我们来看一个例子:

float (*add)(); // 这是函数指针的合法声明
float *add(); // 这是函数指针的非法声明

函数指针可以指向另一个函数,也就是说,它保存了另一个函数的地址。

float add(int a, int b); // 函数声明
float (*a)(int, int); // 函数指针的声明
a = add; // 将add()函数的地址赋给'a'指针

在上述代码中,我们声明了一个名为add的函数,并且还声明了一个返回浮点数类型的函数指针a,该函数指针接受两个整数类型的参数。现在,我们可以将add()函数的地址赋给指针a,因为它们具有相同的返回类型(float)和参数类型(int)。

现在,a是一个指向add()函数的指针。我们可以使用指针a来调用add()函数。让我们看看如何实现:

a(2, 3);

上述语句使用指针a调用add()函数,并向add()传递了两个参数,即2和3。

接下来,让我们看一个简单的示例,演示如何将函数指针作为参数传递。

void display(void (*p)()) {
    for (int i = 1; i <= 5; i++) {
        p(i);
    }
}

void print_numbers(int num) {
    printf("%d ", num);
}

int main() {
    void (*p)(int); // 声明一个返回类型为void的函数指针
    printf("The values are: ");
    display(print_numbers);
    return 0;
}

在上述代码中:

  • 我们定义了两个函数:display()print_numbers()
  • main()函数中,我们声明了一个名为p的函数指针,并在display()函数中调用了print_numbers()函数。
  • 当控制流程进入display()函数时,指针p包含了print_numbers()函数的地址。这意味着我们可以使用函数指针p来调用print_numbers()函数。
  • display()函数的定义中,我们使用了一个for循环,并在循环中使用语句p(i)来调用print_numbers()函数。这里,p(i)意味着在每次迭代中调用print_numbers()函数,并打印出变量i的值。

输出结果如下:

1.png

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int compare(const int *p, const int *q);
int (*f)(const void *a, const void *b);

int main() {
    int a[] = {4, 7, 6, 1, 3, 2};
    int num = sizeof(a) / sizeof(int);
    f = &compare;
    qsort(a, num, sizeof(int), (*f));
    for (int i = 0; i < num; i++) {
        printf("%d ", a[i]);
    }
    return 0;
}

int compare(const int *p, const int *q) {
    if (*p == *q)
        return 0;
    else if (*p < *q)
        return -1;
    else
        return 1;
}

在上述代码中:

  • 我们定义了一个整数类型的数组a。在创建数组后,我们使用sizeof()运算符计算数组的大小,并将结果存储在变量num中。
  • 我们定义了一个名为compare()的函数,它比较数组中的所有元素并按升序排列它们。
  • 我们还声明了一个函数指针f,并通过语句f = &comparecompare()函数的地址存储在f中。
  • 我们调用了qsort()函数,并将数组、数组大小、元素大小和比较函数作为参数传递给它。比较函数compare()将比较数组元素,直到数组元素按升序排序为止。

输出结果如下:

2.png

标签: c语言, c语言教程, c语言技术, c语言学习, c语言学习教程, c语言下载, c语言开发, c语言入门教程, c语言进阶教程, c语言高级教程, c语言面试题, c语言笔试题, c语言编程思想