MST
星途 面试题库

面试题:C语言函数指针与回调函数的应用

编写一个C程序,实现一个排序函数,该函数接收一个函数指针作为参数,用于指定排序的比较规则(升序或降序)。并解释回调函数在此处的作用和优势。
15.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

// 比较函数的原型
typedef int (*CompareFunc)(int, int);

// 交换两个整数
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 冒泡排序函数,接收数组、数组大小和比较函数指针
void bubbleSort(int arr[], int n, CompareFunc compare) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (compare(arr[j], arr[j + 1])) {
                swap(&arr[j], &arr[j + 1]);
            }
        }
    }
}

// 升序比较函数
int ascending(int a, int b) {
    return a > b;
}

// 降序比较函数
int descending(int a, int b) {
    return a < b;
}

// 打印数组
void printArray(int arr[], int n) {
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("原始数组: ");
    printArray(arr, n);

    // 使用升序排序
    bubbleSort(arr, n, ascending);
    printf("升序排序后: ");
    printArray(arr, n);

    // 使用降序排序
    bubbleSort(arr, n, descending);
    printf("降序排序后: ");
    printArray(arr, n);

    return 0;
}

回调函数的作用和优势:

  1. 作用:回调函数在此处用于定义排序的比较规则。冒泡排序函数bubbleSort并不关心具体的比较逻辑(升序还是降序),而是通过接收一个函数指针compare,在需要比较元素时调用该函数。这样,bubbleSort函数本身变得通用,可以根据不同的比较规则进行排序。
  2. 优势
    • 代码复用bubbleSort函数不需要为每种排序规则(升序、降序等)都编写一套单独的实现,只需要接收不同的比较函数指针即可。这大大提高了代码的复用性,减少了重复代码。
    • 灵活性:可以根据具体需求在运行时选择不同的比较规则。例如,在不同的场景下,可能需要升序或降序排序,通过传递不同的回调函数,就可以轻松实现。
    • 解耦:排序算法和比较规则解耦。排序算法只关注如何交换元素以实现排序,而比较规则由外部传入的回调函数定义。这使得代码结构更加清晰,易于维护和扩展。