17. 函数指针的使用案例(回调函数)

印度小哥讲解的指针, 真的很好, 这里附上链接:
https://www.bilibili.com/video/BV1bo4y1Z7xf/?spm_id_from=333.999.0.0

1. 函数指针的使用场景

函数指针的使用围绕着这样一个概念:函数指针可以被用来作为函数参数.

接收函数指针的这个函数, 可以回调函数指针所指向的那个函数.

1.1 代码实例

void A() {                // 定义一个“A函数”
	printf("hello");
}

void B(void (*ptr)()) {   // 将“A函数”作为一个“函数指针参数”.
	ptr();                // 调用“ptr”函数指针.
}


int main() {
	// 第一种方式.
	//void (*p)() = A;  // 用一个“函数指针”指向“A函数”.
	//B(p);             // 调用“B函数”, 将“p”这个函数指针传递过去,


	// 第二种方式
	B(A);               // 这里的“B函数”将“A函数”作为一个参数, 所以这里直接这样书写是没有任何问题的.
	                    // 一个函数的应用传给另一个函数的时候, 那个函数被称为“回调函数”.
	return 0;
}

1.2 体现“回调函数”的意义的例子

// 这里回调函数的意义是:直接使用一个可以任意修改的函数, 进行任意形式的排序, 而不用在原来的位置上进行修改.
// 比如可以创建很多个“(无论什么)compare函数”,  需要什么样的排序方案, 就创建一个排序的排序方案.
// 只需要增加一个“(无论什么)compare函数”, 比如增加一个:“用绝对值作比较”, “按从小到大”, “按从大到小”.
// 最后在进行参数传递的时候, 将对应的“排序方案的函数传递过去”就行了.
// (这样就不用在原来的主要函数上进行修改了, 这样也能保证主要函数的可移植性)
int compare(int a, int b) {
	return a - b;
}

int absolute_compare(int a, int b) {
	return (abs(a) > abs(b)) ? 1 : -1;
}


void BubbleSort(int* arr, int n, int (*compare)(int, int)) {
	for (int i = 0; i < n - 1; i++) {
		for (int j = 0; j < n - i - 1; j++) {
			if (compare(arr[j], arr[j + 1]) > 0) {
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}


int main() {
	int arr[] = { -31, 22, -1, 50, -6, 4 };
	int size = sizeof(arr) / sizeof(arr[0]);
	BubbleSort(arr, size, absolute_compare);

	for (int i = 0; i < size; i++) {
		printf("%d ", arr[i]);
	}

	return 0;
}

1.2.1 利用 qsort函数 表示“函数指针”意义

qsort函数:
void qsort(void* ptr, size_t count, size_t size, int (*comp)(const void*, const void*));

qsort函数参数说明:

  1. 第一个参数:接受一个任意类型的数组 (甚至可以是结构体).
  2. 第二个参数:数组中元素的数量.
  3. 第三个参数:数据类型的大小
  4. 最后一个参数:函数指针, 比较函数的指针. int (*comp)(const void*, const void*)

传入的函数指针是 void*, 这样可以进行任意的修改, 毕竟 void指针可以修改为任意类型的指针.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值