#include <stdio.h>
// 回调函数,用于在数组中查找特定元素
int search(int arr[], int n, int target, int (*cmp)(int, int))
{
for (int i = 0; i < n; i++) {
if (cmp(arr[i], target)) {
return i; // 找到目标元素,返回其索引
}
}
return -1; // 没有找到目标元素
}
// 回调函数,用于比较两个整数是否相等
int equals(int a, int b)
{
return a == b;
}
int main()
{
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
int target = 3;
int index = search(arr, n, target, equals); // 使用equals函数作为回调函数
if (index == -1) {
printf("目标元素 %d 不存在于数组中\n", target);
} else {
printf("目标元素 %d 存在于数组中,其索引为 %d\n", target, index);
}
return 0;
}
在这个例子中,我们定义了两个函数,search
和equals
。search
函数接收一个数组、数组的长度、目标元素和一个用于比较两个元素是否相等的回调函数。equals
函数用于比较两个整数是否相等,它返回1(真)或0(假)。
在主函数中,我们定义了一个整数数组和目标元素,然后调用search
函数,并将equals
函数作为回调函数传递给它。search
函数遍历数组中的每个元素,并使用回调函数比较目标元素和数组元素是否相等。如果找到目标元素,search
函数返回其索引,否则返回-1。
最后,在主函数中,我们检查search
函数的返回值并打印相应的消息。在这个例子中,我们使用了一个简单的回调函数,但在实际的应用程序中,回调函数可能会更加复杂,以满足特定的需求。
int (*cmp)(int, int)
中的cmp
代表回调函数。这种写法是C语言中声明函数指针的方式。
函数指针实际上是一个变量,用于存储函数的地址。通过声明一个函数指针,我们可以将其作为参数传递给其他函数,使得这个函数可以调用回调函数来完成特定的任务。
在search
函数的声明中,我们使用了一个指向函数的指针来表示回调函数,它的类型是int (*)(int, int)
。其中,括号中的(int, int)
表示回调函数的参数列表,而最前面的int *
表示返回类型是一个指向int
类型的指针。
在search
函数中,当我们调用cmp
函数指针时,我们需要使用括号将它括起来,以指示这是一个函数调用。因此,if (cmp(arr[i], target))
这行代码的作用是调用cmp
指针所指向的回调函数,并将arr[i]
和target
作为参数传递给它进行比较。