C语言回调函数的使用例子及讲解
时间: 2023-07-11 22:28:32 浏览: 89
C语言中的回调函数实例
回调函数是一种常见的编程技巧,它允许我们在程序执行过程中动态地指定一个函数,并将其作为参数传递给另一个函数,在满足特定条件时调用该函数。这种技巧在C语言中尤为常见,下面是一个回调函数的使用例子及讲解。
假设我们有一个函数sort_array,用于对一个整型数组进行排序,其函数原型如下:
```c
void sort_array(int* arr, int size);
```
现在,我们想对一个字符串数组进行排序,该数组的每个元素都是一个字符串。但是,我们如何定义比较函数呢?因为字符串之间的比较是有多种方式的,例如按照字典序、按照长度等等。
为了解决这个问题,我们可以使用回调函数。我们定义一个函数指针类型,用于表示比较函数的类型:
```c
typedef int (*compare_func)(const void*, const void*);
```
该类型的定义表示,一个比较函数应该接受两个const void*类型的参数,并返回一个int类型的值,表示两个参数的大小关系。
然后,我们可以修改sort_array函数的原型,将比较函数作为第三个参数传入:
```c
void sort_array(void* arr, int size, compare_func cmp);
```
在sort_array函数内部,我们调用cmp函数来比较数组中的元素:
```c
void sort_array(void* arr, int size, compare_func cmp)
{
// ...
for (int i = 0; i < size - 1; ++i) {
for (int j = i + 1; j < size; ++j) {
if (cmp(arr + i, arr + j) > 0) {
// 交换 arr[i] 和 arr[j]
}
}
}
// ...
}
```
这里的arr + i和arr + j表示数组中第i个元素和第j个元素的地址。cmp(arr + i, arr + j)表示调用比较函数来比较这两个元素的大小关系。
现在,我们可以定义一个比较函数,例如按照字符串长度从小到大排序:
```c
int cmp_by_length(const void* a, const void* b)
{
const char* s1 = *(const char**)a;
const char* s2 = *(const char**)b;
return strlen(s1) - strlen(s2);
}
```
这个函数接受两个const void*类型的参数,我们需要将它们转换为const char**类型的指针,然后比较它们的长度。
最后,我们可以调用sort_array函数来对字符串数组进行排序:
```c
const char* arr[] = { "hello", "world", "c", "language", "programming" };
int size = sizeof(arr) / sizeof(arr[0]);
sort_array(arr, size, cmp_by_length);
```
这里的arr是一个字符串数组,我们可以通过sizeof(arr) / sizeof(arr[0])来计算它的长度。最后一个参数是我们定义的比较函数,表示按照字符串长度从小到大排序。
这就是回调函数的一个使用例子及讲解,它允许我们在程序执行过程中动态地指定一个函数,并将其作为参数传递给另一个函数,从而实现更加灵活的编程。
阅读全文