MST

星途 面试题库

面试题:C语言中函数指针在回调机制中的深度应用

设计一个C语言程序,实现一个通用的排序函数,该函数接受一个数组、数组长度以及一个比较函数的函数指针作为参数。比较函数用于定义排序的逻辑(例如升序或降序)。在主函数中,分别定义针对整数数组升序和降序的比较函数,并调用通用排序函数对整数数组进行升序和降序排序,最后输出排序结果。要求代码结构清晰,充分展示函数指针在回调机制中的灵活运用,同时考虑边界情况和代码的健壮性。
42.8万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

// 比较函数类型定义
typedef int (*CompareFunc)(const void *, const void *);

// 通用排序函数
void mySort(void *arr, size_t length, size_t elementSize, CompareFunc compare) {
    for (size_t i = 0; i < length - 1; ++i) {
        for (size_t j = 0; j < length - i - 1; ++j) {
            char *a = (char *)arr + j * elementSize;
            char *b = (char *)arr + (j + 1) * elementSize;
            if (compare(a, b) > 0) {
                // 交换
                char temp[elementSize];
                for (size_t k = 0; k < elementSize; ++k) {
                    temp[k] = a[k];
                    a[k] = b[k];
                    b[k] = temp[k];
                }
            }
        }
    }
}

// 整数升序比较函数
int compareAscending(const void *a, const void *b) {
    return (*(int *)a - *(int *)b);
}

// 整数降序比较函数
int compareDescending(const void *a, const void *b) {
    return (*(int *)b - *(int *)a);
}

int main() {
    int arr[] = {5, 4, 3, 2, 1};
    size_t length = sizeof(arr) / sizeof(arr[0]);

    // 升序排序
    mySort(arr, length, sizeof(int), compareAscending);
    printf("升序排序结果: ");
    for (size_t i = 0; i < length; ++i) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    // 降序排序
    mySort(arr, length, sizeof(int), compareDescending);
    printf("降序排序结果: ");
    for (size_t i = 0; i < length; ++i) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}
  1. 函数指针类型定义
    • typedef int (*CompareFunc)(const void *, const void *); 定义了一个函数指针类型 CompareFunc,该类型的函数接受两个 const void * 类型的参数,并返回一个 int 类型的值。这个函数指针用于指向具体的比较函数,例如升序或降序的比较函数。
  2. 通用排序函数 mySort
    • void mySort(void *arr, size_t length, size_t elementSize, CompareFunc compare):这个函数实现了通用的排序逻辑。它接受一个指向数组的指针 arr,数组的长度 length,每个元素的大小 elementSize,以及一个比较函数的函数指针 compare
    • 在函数内部,使用冒泡排序算法遍历数组。通过 compare 函数来判断相邻元素的顺序,如果需要交换则进行交换。这里使用 char * 指针进行字节级的操作,以确保能处理任意类型的数组。
  3. 整数升序比较函数 compareAscending
    • int compareAscending(const void *a, const void *b):该函数接受两个 const void * 类型的指针,将它们转换为 int * 类型,然后返回 *(int *)a - *(int *)b。如果 a 小于 b,返回负数;如果 a 等于 b,返回0;如果 a 大于 b,返回正数,以此实现升序排序。
  4. 整数降序比较函数 compareDescending
    • int compareDescending(const void *a, const void *b):与升序比较函数类似,只是返回值为 *(int *)b - *(int *)a,实现降序排序。
  5. 主函数 main
    • 定义一个整数数组 arr 并初始化。
    • 调用 mySort 函数分别进行升序和降序排序,并输出排序结果。这样展示了函数指针在回调机制中的灵活运用,同时代码也考虑了处理不同类型数组的边界情况和健壮性。