C语言 函数指针

  • Post category:C

C语言 函数指针使用攻略

什么是函数指针

函数指针是指向函数的指针变量,它能够存储函数的地址。函数指针可以实现将函数作为参数进行传递,或者作为返回值返回一个函数的地址。

声明函数指针

函数指针的声明和普通指针声明类似,只是多了函数的返回类型以及函数的参数列表,声明函数指针的一般形式为:

返回类型 (*函数指针变量名)(参数列表);

例如:

int (*p)(int, int);

表示 p 是一个指向返回值类型为 int,参数为两个 int 类型变量的函数指针。

使用函数指针

1. 函数指针作为函数参数

函数指针常常被用作函数参数,可以传递一个函数的地址到另一个函数中,并在函数中调用该函数。

以排序函数为例,下面是一个简单的冒泡排序代码:

void bubble_sort(int nums[], int n) {
    int i, j;
    for (i = 0; i < n-1; i++) {
        int flag = 0;
        for (j = 0; j < n-i-1; j++) {
            if (nums[j] > nums[j+1]) {
                int temp = nums[j];
                nums[j] = nums[j+1];
                nums[j+1] = temp;
                flag = 1;
            }
        }
        if (flag == 0) {
            break;
        }
    }
}

现在我们想要排序一个字符串数组,该怎么办呢?这时我们可以编写一个通用的排序函数,使用函数指针作为参数,用于比较两个元素的大小,如下所示:

void sort(char *strs[], int n, int (*compare)(const char*, const char*)) {
    int i, j;
    for (i = 0; i < n-1; i++) {
        int flag = 0;
        for (j = 0; j < n-i-1; j++) {
            if (compare(strs[j], strs[j+1]) > 0) {
                char *temp = strs[j];
                strs[j] = strs[j+1];
                strs[j+1] = temp;
                flag = 1;
            }
        }
        if (flag == 0) {
            break;
        }
    }
}

此时,我们再定义一个比较函数,用于比较两个字符串的大小,如下所示:

int compare_str(const char *s1, const char *s2) {
    return strcmp(s1, s2);  // 使用标准库中的 strcmp 函数比较两个字符串
}

这时我们将两个函数作为参数传递给 sort 函数即可:

int main() {
    char *strs[] = {"apple", "banana", "orange", "pear"};
    int n = 4;
    sort(strs, n, compare_str);
    int i;
    for (i = 0; i < n; i++) {
        printf("%s ", strs[i]);
    }
    return 0;
}

最终输出结果为:

apple banana orange pear

2. 函数指针作为函数返回值

函数指针还可以作为函数的返回值,例如我们可以编写一个工厂函数,用于根据传入的参数返回不同的函数指针。下面是一个例子,用于返回加法和乘法函数的函数指针:

int add(int a, int b) {
    return a + b;
}

int mul(int a, int b) {
    return a * b;
}

int (*get_func(char op))(int, int) {
    if (op == '+') {
        return add;
    } else if (op == '*') {
        return mul;
    } else {
        return NULL;  // 返回空指针表示错误
    }
}

我们可以通过调用 get_func(‘+’) 函数来获取一个指向加法函数的指针,然后用该指针调用函数:

int (*p)(int, int);
p = get_func('+');  // 获取指向加法函数的指针
int x = 3, y = 4;
int result = p(x, y);  // 调用加法函数,得到结果 7

同样的,我们可以通过调用 get_func(‘*’) 函数来获取一个指向乘法函数的指针,然后用该指针调用函数。

总结

函数指针在 C 语言中是一个非常常用的特性,可以实现函数的封装性和灵活性。本文介绍了函数指针的声明、使用方法,以及两个例子:函数指针作为函数参数,和函数指针作为函数返回值。希望对大家理解函数指针有所帮助。