#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef bool (*pf_bool)();
bool is_less_than_10(int);
int* intarr_filter(int[], int, pf_bool, unsigned*);
int main(void) {
int arr[] = {1, 10, 3, 6, 9, 22, 1, 20, 17, 9, 5, 14, 2, 1, 12, 11};
int sorted_arr_length;
int* sorted_arr = intarr_filter(arr, sizeof(arr) / sizeof(arr[0]), is_less_than_10, &sorted_arr_length);
for (int i = 0; i < sorted_arr_length; i++) {
printf("%d ", sorted_arr[i]);
}
}
bool is_less_than_10(int number) {
return number < 10;
}
int* intarr_filter(int arr[], int length, pf_bool pf, unsigned* sorted_arr_length) {
int fits = 0;
for (int i = 0; i < length - 1; i++) {
if (pf(arr[i])) fits++;
}
int* sorted_arr = (int*) malloc(sizeof(int) * fits);
*sorted_arr_length = fits;
int current_index = 0;
for (int i = 0; i < length - 1; i++) {
if (pf(arr[i])) {
sorted_arr[current_index] = arr[i];
current_index++;
}
}
return sorted_arr;
}
有一个函数intarr_filter使用传递的函数过滤数组的值,并返回一个指向只包含匹配值的新数组的指针。我可以安全地传递一个函数is_less_than_10并获得预期的结果。但是如果我需要一个带有多个参数的过滤函数呢?如果我有这样的功能怎么办:
bool is_less(int number1, int number2) {
return number1 < number2;
}
如果我不提前知道我需要比较什么数字怎么办?如何将多个参数传递给我传入的回调函数intarr_filter?
向您的回调函数添加一个类型参数
void *,通过它可以将指向任意“用户数据”的指针传递给它。void *也向回调添加一个类型参数intarr_filter- 它应该在每次调用时将该参数直接传递给回调。通过这个void *,您可以将调用代码中的任何内容传递给回调。甚至(如果您的用户数据适合位深度
intptr_t)