C 函数指针与回调函数学习笔记
什么是函数指针?
在 C 语言中,函数名本质上就是一个指针,指向该函数所在的内存地址。因此,我们可以把函数的指针称为函数指针。
函数指针的定义格式如下:
cCopy Code返回类型 (*指针变量名)(参数列表);
例如,我们定义一个函数 add
,并声明一个函数指针 add_p
:
cCopy Codeint add(int a, int b)
{
return a + b;
}
int (*add_p)(int a, int b) = add;
上述代码中,add_p
就是函数 add
的指针,我们可以通过 add_p
调用 add
函数。
函数指针作为参数
函数指针可以作为函数的参数,这样可以让函数更加灵活地运用。
例如,我们定义一个函数 operate
,该函数接受两个整数和一个函数指针作为参数,用于对这两个整数进行某种操作,操作方式由函数指针决定:
cCopy Codevoid operate(int a, int b, int (*p)(int, int))
{
int result = p(a, b);
printf("%d\n", result);
}
我们可以调用 operate
函数,并传入函数指针 add_p
作为参数:
cCopy Codeoperate(1, 2, add_p);
上述代码将输出结果 3
。
什么是回调函数?
回调函数,顾名思义,就是让被调用函数在完成自己的任务后调用传给它的函数,以便在外部能够获取到这个函数的结果。
例如,我们定义一个函数 sort
,该函数接受一个整型数组和一个指向比较函数的函数指针作为参数,用于对该数组进行排序,排序方式由比较函数决定:
cCopy Codevoid sort(int *arr, int size, int (*cmp)(int, int))
{
for (int i = 0; i < size - 1; ++i)
{
for (int j = i + 1; j < size; ++j)
{
if (cmp(arr[i], arr[j]) > 0)
{
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
}
我们定义一个比较函数 greater_than
,用于判断两个数的大小关系:
cCopy Codeint greater_than(int a, int b)
{
return a > b;
}
我们可以调用 sort
函数,并传入比较函数 greater_than
作为参数:
cCopy Codeint arr[] = {2, 3, 1, 5, 4};
int size = sizeof(arr) / sizeof(int);
sort(arr, size, greater_than);
上述代码将对整型数组进行升序排序。
实例
下面是一个完整的示例,演示了如何使用函数指针和回调函数:
cCopy Code#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
void operate(int a, int b, int (*p)(int, int))
{
int result = p(a, b);
printf("%d\n", result);
}
int greater_than(int a, int b)
{
return a > b;
}
void sort(int *arr, int size, int (*cmp)(int, int))
{
for (int i = 0; i < size - 1; ++i)
{
for (int j = i + 1; j < size; ++j)
{
if (cmp(arr[i], arr[j]) > 0)
{
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
}
int main()
{
// 函数指针示例
int (*add_p)(int, int) = add;
operate(1, 2, add_p);
// 回调函数示例
int arr[] = {2, 3, 1, 5, 4};
int size = sizeof(arr) / sizeof(int);
sort(arr, size, greater_than);
for (int i = 0; i < size; ++i)
{
printf("%d ", arr[i]);
}
return 0;
}
该示例首先演示了如何使用函数指针,将函数 add
的指针作为参数传入函数 operate
中。
接着,示例演示了如何使用回调函数,将比较函数 greater_than
的指针作为参数传入函数 sort
中,实现对整型数组的升序排序。
以上就是 C 函数指针与回调函数的学习笔记。