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