到目前为止,我们已经看到在C编程中,我们可以将变量作为参数传递给函数。我们不能将函数作为参数传递给另一个函数。但是我们可以使用函数指针将函数的引用作为参数传递。此过程称为按引用调用,因为函数参数作为保存参数地址的指针传递。如果函数使用指针进行了任何更改,则它还将在传递的变量的地址处反映更改。
因此,C编程允许您创建一个指向函数的指针,该指针可以作为参数进一步传递给函数。我们可以如下创建一个函数指针:
(type) (*pointer_name)(parameter);
在以上语法中,类型(type)是函数返回的变量类型, * pointer_name 是函数指针,而参数(parameter)是传递给函数的参数列表。
我们来看一个例子:
float (*add)();//this is a legal declaration for the function pointer float *add();//this is an illegal declaration for the function pointer
函数指针也可以指向另一个函数,或者可以说它保存另一个函数的地址。
float add (int a, int b); //function declaration float (*a)(int, int); //declaration of a pointer to a function a=add;//assigning address of add() to 'a' pointer
在上述情况下,我们声明了一个名为" add "的函数。我们还声明了函数指针(* a),该函数返回浮点型值,并包含两个整数类型的参数。现在,我们可以将 add()函数的地址分配给'a'指针,因为它们都具有相同的返回类型(浮点数)和相同类型的参数。
现在," a"是指向add()函数的指针。我们可以通过使用指针" a"来调用add()函数。让我们看看如何做到这一点:
a(2, 3);
上面的语句使用指针'a'调用add()函数,并且在'a'中传递了两个参数,即2和3。
让我们看一个简单的示例,说明如何将函数指针作为参数传递。
void display(void (*p)()) { for(int i=1;i<=5;i++) { p(i); } } void print_numbers(int num) { cout<<num; } int main() { void (*p)(int); //void function pointer declaration printf("The values are :"); display(print_numbers); return 0; }
在上面的代码中,
输出
现在,我们将在Quicksort函数" 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]); } } int compare(const int *p, const int *q) { if (*p == *q) return 0; else if (*p < *q) return -1; else return 1; }
在上面的代码中,
输出
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)
Spring Boot与Kubernetes云原生微服务实践 -〔杨波〕
HarmonyOS快速入门与实战 -〔QCon+案例研习社〕