C语言回调函数

博客介绍了C语言回调函数,它是将一个函数作为参数传递给另一个函数,通过函数指针实现。其特点是能降低代码耦合性,还分别提及了不带参数和带参数的回调函数。

https://www.runoob.com/w3cnote/c-callback-function.html

回调函数:其实就是把一个函数当做参数传递给另一个函数,实现的方法是通过函数指针的方法;
特点:降低代码的耦合性;

1》不带参数的回调函数

在这里插入代码片
```#include<stdio.h>

int Callback_1() // Callback Function 1
{
    printf("Hello, this is Callback_1 ");
    return 0;
}

int Callback_2() // Callback Function 2
{
    printf("Hello, this is Callback_2 ");
    return 0;
}

int Callback_3() // Callback Function 3
{
    printf("Hello, this is Callback_3 ");
    return 0;
}

int Handle(int (*Callback)())
{
    printf("Entering Handle Function. ");
    Callback();
    printf("Leaving Handle Function. ");
}

int main()
{
    printf("Entering Main Function. ");
    Handle(Callback_1);
    Handle(Callback_2);
    Handle(Callback_3);
    printf("Leaving Main Function. ");
    return 0;
}
运行结果:

Entering Main Function.
Entering Handle Function.
Hello, this is Callback_1
Leaving Handle Function.
Entering Handle Function.
Hello, this is Callback_2
Leaving Handle Function.
Entering Handle Function.
Hello, this is Callback_3
Leaving Handle Function.
Leaving Main Function.

 

2》带参数的回调函数





```c
#include<stdio.h>

int Callback_1(int x) // Callback Function 1
{
    printf("Hello, this is Callback_1: x = %d ", x);
    return 0;
}

int Callback_2(int x) // Callback Function 2
{
    printf("Hello, this is Callback_2: x = %d ", x);
    return 0;
}

int Callback_3(int x) // Callback Function 3
{
    printf("Hello, this is Callback_3: x = %d ", x);
    return 0;
}

int Handle(int y, int (*Callback)(int))
{
    printf("Entering Handle Function. ");
    Callback(y);
    printf("Leaving Handle Function. ");
}

int main()
{
    int a = 2;
    int b = 4;
    int c = 6;
    printf("Entering Main Function. ");
    Handle(a, Callback_1);
    Handle(b, Callback_2);
    Handle(c, Callback_3);
    printf("Leaving Main Function. ");
    return 0;
}
运行结果:

Entering Main Function.
Entering Handle Function.
Hello, this is Callback_1: x = 2
Leaving Handle Function.
Entering Handle Function.
Hello, this is Callback_2: x = 4
Leaving Handle Function.
Entering Handle Function.
Hello, this is Callback_3: x = 6
Leaving Handle Function.
Leaving Main Function.
C语言回调函数的使用方法主要包含以下几个步骤: 1. **定义回调函数原型**:使用`typedef`定义回调函数的类型,明确其参数和返回值。 2. **实现回调函数**:编写具体的回调函数,其参数和返回值要与定义的原型一致。 3. **实现调用回调函数的函数**:该函数接受回调函数作为参数,并在合适的机调用它。 4. **调用含回调函数的函数**:在`main`函数或其他地方调用这个函数,并传入实际的回调函数。 以下是几个C语言回调函数的示例: ### 简单的回调函数示例 ```c #include <stdio.h> // 回调函数的原型 typedef void (*CallbackFunction)(int); // 调用回调函数的函数 void performOperation(int value, CallbackFunction callback) { printf("Performing operation with value: %d\n", value); // 调用回调函数 callback(value); } // 实际的回调函数 void callbackFunction(int result) { printf("Callback function called with result: %d\n", result); } int main() { int inputValue = 42; // 使用回调函数调用performOperation performOperation(inputValue, callbackFunction); return 0; } ``` 此示例中,`performOperation`函数接受一个整数和一个回调函数作为参数,在函数内部调用了传入的回调函数,并将整数作为参数传递给它。 ### 排序函数中的回调函数示例 ```c #include <stdio.h> #include <stdlib.h> // 回调函数,用于比较两个整数 int compare(const void *a, const void *b) { int arg1 = *(const int*)a; int arg2 = *(const int*)b; return arg1 - arg2; } // 排序函数,使用qsort,它接受一个比较函数作为参数 void sortArray(int arr[], int n) { qsort(arr, n, sizeof(int), compare); } int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(arr)/sizeof(arr[0]); sortArray(arr, n); for(int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; } ``` 在这个示例里,`sortArray`函数调用了标准库的`qsort`函数,并传入了一个回调函数`compare`,用于比较数组元素的大小,从而实现排序功能。 ### 自定义排序函数的回调函数示例 ```c #include <stdio.h> void sort(int a[], int size, int (*p)(int, int)){ int i, j; for (i = 0; i < size - 1; i++){ for (j = 0; j < size - 1 - i; j++){ if (p(a[j], a[j + 1])) { int t = a[j]; a[j] = a[j + 1]; a[j + 1] = t; } } } } int less(int x, int y){ return (x > y) ? 1 : 0; } int greater(int x, int y){ return (x < y) ? 1 : 0; } int main(){ int a[10] = {1, 0, 4, 7, 2, 9, 5, 3, 8, 6}; sort(a, 10, greater);//大到小排序 for (int i = 0; i < 10; i++){ printf("%d ", a[i]); } printf("\n"); sort(a, 10, less);//小到大排序 for (int i = 0; i < 10; i++){ printf("%d ", a[i]); } return 0; } ``` 该示例中,`sort`函数接受一个数组、数组大小和一个回调函数作为参数,通过传入不同的回调函数`less`和`greater`,可以实现从小到大或从大到小的排序 [^1][^3][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值