C语言中,函数指针是指向函数的指针变量。使用函数指针可以让程序具有更高的灵活性和可扩展性,能够更好地适应不同的需求。
1. 声明函数指针
声明函数指针的语法如下:
返回类型 (*指针变量名)(参数列表);
例如:
int (*myFunc)(int a, int b);
上述代码中,声明了一个名为 myFunc 的指向返回类型为 int,参数列表为 (int, int) 的函数指针变量。
2. 定义函数指针
定义函数指针就是将指针变量指向特定的函数。例如:
int max(int a, int b) {
return a > b ? a : b;
}
int (*myFunc)(int a, int b) = max;
上述代码中,将 myFunc 指向了 max 函数。这样,可以通过 myFunc 调用 max 函数。
3. 函数指针作为函数参数
函数指针作为函数参数可以用于回调函数、函数指针数组等场合。例如:
int calculate(int a, int b, int (*func)(int, int)) {
return func(a, b);
}
int add(int a, int b) {
return a + b;
}
int substract(int a, int b) {
return a - b;
}
int main() {
int a = 10, b = 5;
int result1 = calculate(a, b, add);
int result2 = calculate(a, b, substract);
printf("%d %d", result1, result2);
return 0;
}
上述代码中,calculate 函数接收三个参数,前两个参数是要进行计算的两个数,第三个参数是函数指针,用于指定要进行的计算方式。在 main 函数中,先定义了 add 和 substract 两个函数,然后通过 calculate 函数分别调用了这两个函数。
4. 函数指针数组
函数指针数组是一种数组类型,每个数组元素都是一个指向函数的指针变量。当需要按照一定的规则调用不同的函数时,可以使用函数指针数组。例如:
int add(int a, int b) {
return a + b;
}
int substract(int a, int b) {
return a - b;
}
int multiply(int a, int b) {
return a * b;
}
int divide(int a, int b) {
return b == 0 ? 0 : a / b;
}
int main() {
int a = 10, b = 5;
int (*funcArr[4])(int, int) = {add, substract, multiply, divide};
for (int i = 0; i < 4; i++) {
printf("%d ", funcArr[i](a, b));
}
return 0;
}
上述代码中,定义了一个名为 funcArr 的函数指针数组,数组中包含 4 个元素。每个元素都是一个指向特定函数的函数指针。在 main 函数中,通过 for 循环遍历数组,依次调用了这 4 个函数,并输出结果。
5. 示例说明
下面通过两个示例说明函数指针的使用。
示例1:函数指针作为回调函数
typedef void (*CallBackFunc)(int);
void print1(int n) {
printf("print1: %d\n", n);
}
void print2(int n) {
printf("print2: %d\n", n);
}
void loop(int count, CallBackFunc func) {
for (int i = 1; i <= count; i++) {
func(i);
}
}
int main() {
loop(3, print1);
loop(5, print2);
return 0;
}
上述代码中,定义了一个回调函数类型 CallBackFunc,该类型的变量可以指向一个接收 int 类型参数并返回 void 类型的函数。然后定义了两个打印函数 print1 和 print2。在 loop 函数中,循环执行 func 函数 count 次,并将变量 i 作为参数传递给 func 函数。在 main 函数中,通过调用 loop 函数,分别将 print1 和 print2 作为参数传递给 func,实现了不同的打印方式。
示例2:函数指针作为排序函数
#include <stdio.h>
int compare(int a, int b) {
if (a > b) return 1;
if (a < b) return -1;
return 0;
}
void sort(int *arr, int size, int (*compareFunc)(int, int)) {
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - i - 1; j++) {
if (compareFunc(arr[j], arr[j + 1]) > 0) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main() {
int arr[] = {3, 7, 1, 5, 9, 2, 8, 4, 6};
int size = sizeof(arr) / sizeof(int);
sort(arr, size, compare);
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
return 0;
}
上述代码中,首先定义了一个 compare 函数,该函数接收两个参数并返回一个 int 类型的值,用于比较这两个参数的大小。然后定义了一个 sort 函数,该函数接收一个整型数组、数组大小以及一个函数指针,用于对数组进行排序。在 sort 函数中,使用了冒泡排序的算法进行排序,并使用 compareFunc 指针指向的函数进行比较。在 main 函数中,定义了一个整型数组,并通过调用 sort 函数对该数组进行排序,在排序结果被输出后,示例结束。
综上所述,函数指针可以用于多种场合,需要根据实际情况进行选择和使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言使用函数指针 - Python技术站